【问题标题】:Load 3rd party clr dll in SQL Server在 SQL Server 中加载第 3 方 clr dll
【发布时间】:2017-10-11 13:33:04
【问题描述】:

我在 C# 中编写了一个 SQL CLR 函数,该函数具有一些依赖性(对 npgsql.dll)。当它过去没有任何依赖关系时,我可以将它作为新程序集添加到 SQL Server 中而没有任何问题 - 但现在我不能这样做。

我收到此错误:

消息 10301,第 16 级,状态 1,第 17 行
程序集 'Database1' 引用程序集 'system.directoryservices, version=4.0.0.0,culture=neutral, publickeytoken=b03f5f7f11d50a3a.',它在当前数据库中不存在。 SQL Server 试图从引用程序集所在的同一位置定位并自动加载引用程序集,但该操作失败(原因:2(系统找不到指定的文件。))。请将引用的程序集加载到当前数据库中,然后重试您的请求。

编辑: 这个问题不仅仅是'system.directoryservices',所以当我使用另一个npgsql.dll时,我会得到以下错误:

消息 10301,级别 16,状态 1,第 20 行程序集“数据库 1”引用 程序集'system.threading.tasks.extensions,版本= 4.1.0.0, 文化=中性,publickeytoken=cc7b13ffcd2ddd51.',这不是 存在于当前数据库中。 SQL Server 试图找到并 自动从同一位置加载引用的程序集 引用程序集的来源,但该操作失败 (原因:2(系统找不到指定的文件。))。请加载 将引用的程序集放入当前数据库并重试您的 请求。

并且任何尝试使用开发人员命令提示符将这些库添加到 GAC 的尝试都不起作用。

【问题讨论】:

  • 哪一部分不存在......你不明白吗?您引用的这个 DLL 在 SQL Server .NET 环境中不存在 - 如果您需要它,您必须加载它并将其添加到 SQL Server之前加载您自己的程序集。
  • 正常情况下,像System.DirectoryServices这样的程序集是从GAC加载的。在 SQL Server 中,这些情况不适用。它有自己的加载程序集的逻辑并忽略 GAC,除了一小部分允许的白名单程序集 - 其中System.DirectoryServices 不是其中之一。它(以及它的依赖项)必须在它可用之前显式添加到 SQL Server 的程序集集合中。显然,您已经拥有的程序集的早期版本根本没有引用它。
  • 感谢您的帮助@Jeroen Mostert。我尝试在 GAC 中添加“System.DirectoryServices”,为此我在 .net 路径中找到了这个 dll,并使用了开发人员命令提示符。但我又遇到了同样的错误。是因为我的版本吗?如果是,我该如何解决?

标签: c# sql-server sqlclr


【解决方案1】:

这个问题已经在这里被问过好几次了。但是,除了将其列为重复项之外,还需要先说明一下:

在将 DirectoryServices DLL 导入 SQL Server 之前(有一定风险的操作),请确保您实际上不能以任何其他方式使用该功能。例如:

C# clr udf for Active Directory group membership

否则,请看这里:

How to register System.DirectoryServices for use in SQL CLR User Functions?

这里的“修复”是启用TRUSTWORTHY,这无论如何都不是一个好的选择,但它是加载不受支持的 .NET Framework 库的常用方法。我正在研究另一种目前看起来不错且不需要TRUSTWORTHY 的方法,但我需要进行更多测试才能推荐它。一旦我有时间进行全面测试和记录,我稍后会使用该信息更新它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2012-08-04
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多