【发布时间】: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