gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:49:03 34 4
gpt4 key购买 nike

我有一个庞大的 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组装version=3.0.0.0 ,它依赖于 System.Web.dll组装版2.0.0.0 .

加载中 System.Web程序集给了我以下错误:

Assembly 'System.Web' references assembly 'system.web, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: version, culture or public key mismatch). Please load the referenced assembly into the current database and retry your request.



我已经找到部署问题的解决方案 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 - Unmanaged code in SQL CLR .我怀疑这是由于引擎如何加载 DLL。它们提供了一系列选项,包括将代码托管在 sql server 之外的另一个服务中,以及使用 WCF 或 COM 访问代码。最终选项可能是将您的代码重新编译为纯托管 C++,但这可能不是遗留代码的选项。

    Understanding CLR Integration in SQL Server 2005提供有关该过程如何工作的更多信息。

    To further restrict the code that is allowed to exist and execute inside SQL Server each assembly must be registered with a set of permissions. Three pre-defined sets are available to use; SAFE, EXTERNAL_ACCESS and UNSAFE ...



    您还应该查看 CLR Integration Security ,并确定您正在执行的代码所需的信任级别,以及您是否能够访问使用 CLR 进程中的代码。

    关于sql-server-2008 - 从 SQL Server 2008 调用非托管 C/C++ DLL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8527588/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com