我有一个大型的C/C++函数库,需要从SQL Server 2008中调用。我编写了一个C#适配器类,通过DllImport从Win32 DLL中加载这些函数并将其暴露给.Net代码,在大多数.Net应用程序中,这个方法都能正常工作。现在,我尝试使用相同的技术来使用SQL Server CLR,创建了一组CLR函数和存储过程,它们调用适配器类。但是这个方法无法运行,因为尝试加载非托管DLL会导致System.BadImageFormatException异常。我可以使用扩展存储过程来完成这项任务,但这种方法已经被弃用,并且在任何新版本的SQL Server中都可能被停用。正确的调用CLR存储过程中非托管函数的方法是什么?我的猜测是这应该在进程外部完成。
我正在尝试让我的存储过程调用公开这些函数的Web服务。听起来不错,但是到目前为止,我在部署使Web服务调用的SQLCLR程序集时遇到了问题。我无法加载 System.ServiceModel.dll 版本3.0.0.0 的程序集,它依赖于 System.Web.dll 版本2.0.0.0 的程序集。 加载 System.Web 程序集时,出现以下错误:
Assembly 'System.Web' 引用了程序集 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.',但该程序集在当前数据库中不存在。SQL Server 尝试查找并从引用程序集的相同位置自动加载所引用的程序集,但该操作失败(原因:版本、文化或公钥标记不匹配)。请将所引用的程序集加载到当前数据库中,并重试请求。 我已经找到了解决部署 System.Web 程序集的问题的方法。应该从 C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll 部署它,而不是从 C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll 部署它。然后所有其他必需的程序集也会得到部署。
以下是按照部署顺序列出的程序集: - C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\SMdiagnostics.dll - C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll - C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll - C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.dll - C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.Selectors.dll - C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\Microsoft.Transactions.Bridge.dll
我正在尝试让我的存储过程调用公开这些函数的Web服务。听起来不错,但是到目前为止,我在部署使Web服务调用的SQLCLR程序集时遇到了问题。我无法加载 System.ServiceModel.dll 版本3.0.0.0 的程序集,它依赖于 System.Web.dll 版本2.0.0.0 的程序集。 加载 System.Web 程序集时,出现以下错误:
Assembly 'System.Web' 引用了程序集 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.',但该程序集在当前数据库中不存在。SQL Server 尝试查找并从引用程序集的相同位置自动加载所引用的程序集,但该操作失败(原因:版本、文化或公钥标记不匹配)。请将所引用的程序集加载到当前数据库中,并重试请求。 我已经找到了解决部署 System.Web 程序集的问题的方法。应该从 C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll 部署它,而不是从 C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll 部署它。然后所有其他必需的程序集也会得到部署。
以下是按照部署顺序列出的程序集: - C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\SMdiagnostics.dll - C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll - C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll - C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.dll - C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.Selectors.dll - C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\Microsoft.Transactions.Bridge.dll
Framework64
加载程序集,这意味着你有一个64位服务器,在其中你无法加载32位本机程序集。 - GSerg