我有一个庞大的 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
.
Loading 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
这里有趣的讨论:MSDN - SQL CLR 中的非托管代码 http://social.msdn.microsoft.com/Forums/en/sqlnetfx/thread/4a032c4b-1402-4c53-b34e-8c8bd724f904。我怀疑这是由于引擎加载 DLL 的方式造成的。他们提供了一系列选项,包括将代码托管在 SQL Server 外部的另一个服务中,以及使用 WCF 或 COM 访问代码。最后的选项可能是将代码重新编译为纯托管 C++,但这可能不是遗留代码的选项。
了解 SQL Server 2005 中的 CLR 集成 http://www.hedgate.net/writings/understanding-clr-integration/提供有关该流程如何运作的更多信息。
进一步限制允许存在和执行的代码
在 SQL Server 内部,每个程序集都必须注册一组
权限。三个预定义的集合可供使用;安全的,
EXTERNAL_ACCESS 和不安全
...
您还应该回顾一下CLR 集成安全 http://msdn.microsoft.com/en-us/library/ms131071.aspx,并确定您正在执行的代码所需的信任级别以及您是否能够在 CLR 进程中访问使用该代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)