Ram*_*zay 5 dll unmanaged clrstoredprocedure sql-server-2008
我有一个庞大的C/C++函数库,需要从SQL Server 2008调用.我编写了一个C#适配器类,它从Win32 DLL加载这些函数DllImport并将它们公开给.Net代码.这在大多数.Net应用程序中运行得非常好.
现在,我试图使用与SQL Server CLR相同的技术.我创建了一组CLR函数和存储过程,它们调用适配器类.这不会尝试加载非托管DLL结果System.BadImageFormatException.
我可以使用扩展存储过程执行此操作,但该方法已弃用,可能会在任何新版本的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.然后也部署了所有其他所需的程序集.
部署顺序中的程序集列表:
这里有一个有趣的讨论:MSDN - SQL CLR 中的非托管代码。我怀疑这是由于引擎加载 DLL 的方式造成的。他们提供了一系列选项,包括将代码托管在 SQL Server 外部的另一个服务中,以及使用 WCF 或 COM 访问代码。最后的选项可能是将代码重新编译为纯托管 C++,但这可能不是遗留代码的选项。
了解 SQL Server 2005 中的 CLR 集成提供了有关该过程如何工作的更多信息。
为了进一步限制允许在 SQL Server 内存在和执行的代码,每个程序集必须注册一组权限。三个预定义的集合可供使用;安全、外部访问和不安全...
您还应该查看CLR 集成安全性,并确定您正在执行的代码所需的信任级别以及您是否能够在 CLR 进程中访问并使用该代码。