从SQL Server 2008调用非托管C / C ++ DLL函数

时间:2011-12-15 22:33:27

标签: sql-server-2008 dll unmanaged clrstoredprocedure

我有一个庞大的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部署它。然后也会部署所有其他必需的程序集。

部署顺序的程序集列表:

  • 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 \框架\ 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

1 个答案:

答案 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流程中的代码。