我有一个庞大的 C/C++ 函数库,需要从 SQL Server 2008 调用。我编写了一个 C# 适配器类,它从 Win32 DLL 加载这些函数DllImport
并将它们公开给 .Net 代码。这在大多数 .Net 应用程序中运行良好。
现在,我尝试在 SQL Server CLR 中使用相同的技术。我创建了一组调用适配器类的 CLR 函数和存储过程。这不起作用,因为尝试加载非托管 DLL 会导致System.BadImageFormatException
.
我可以使用扩展存储过程来做到这一点,但该方法已被弃用,并且可能在任何新版本的 SQL Server 中都不再使用。
从 CLR 存储过程调用非托管函数的正确方法是什么?我猜这应该在进程外完成。
我试图让我的存储过程调用公开这些功能的 Web 服务。这听起来是个好主意,但到目前为止,我在部署进行 Web 服务调用的 SQLCLR 程序集时遇到了问题。我无法加载依赖于程序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
。然后所有其他必需的程序集也被部署。
按部署顺序排列的程序集列表:
- 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