我有一个庞大的C / C ++函数库,需要从SQL Server 2008调用。
我编写了一个C#适配器类,它使用DllImport
从Win32 DLL加载这些函数,并将它们暴露给.Net代码。这在大多数.Net应用程序中都可以正常工作
现在,我试图使用与SQL Server CLR相同的技术。我创建了一组CLR函数和存储过程,它们调用适配器类。这不适用于尝试在System.BadImageFormatException
中加载非托管DLL结果
我可以使用扩展存储过程执行此操作,但该方法已弃用,可能会在任何新版本的SQL Server中停止使用
从CLR存储过程调用非托管函数的正确方法是什么?我猜这应该是在进程外完成的。
我试图让我的存储过程调用一个公开这些函数的Web服务。这听起来是个好主意,但到目前为止,我遇到了部署SQLCLR程序集的问题,该程序集使Web服务调用。我无法加载System.ServiceModel.dll
汇编version=3.0.0.0
,它依赖于System.Web.dll
汇编版本2.0.0.0
。
加载System.Web
程序集会出现以下错误:
程序集'System.Web'引用程序集'system.web,version = 2.0.0.0,culture = neutral,publickeytoken = b03f5f7f11d50a3a。',它在当前数据库中不存在。 SQL Server尝试从引用程序集来自的相同位置定位并自动加载引用的程序集,但该操作失败(原因:版本,区域性或公钥不匹配)。请将引用的程序集加载到当前数据库中,然后重试您的请求。
我找到了部署System.Web
程序集问题的解决方案。它应该从C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll
部署,而不是从C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll
部署它。然后也会部署所有其他必需的程序集。
部署顺序的程序集列表:
答案 0 :(得分:1)
在此进行讨论:MSDN - Unmanaged code in SQL CLR。我怀疑这是由于引擎如何加载DLL。它们提供了一系列选项,包括在另一个服务中托管sql server外部的代码,以及使用WCF或COM访问代码。最终选项可能是将您的代码重新编译为纯托管C ++,但这可能不是遗留代码的选项。
Understanding CLR Integration in SQL Server 2005提供了有关该过程如何运作的更多信息。
进一步限制允许存在和执行的代码 在SQL Server内部,每个程序集必须注册一组 权限。可以使用三个预定义的集合;安全, EXTERNAL_ACCESS和UNSAFE ...
您还应该查看CLR Integration Security,并确定您正在执行的代码所需的信任级别,以及您是否能够访问使用CLR流程中的代码。