【问题标题】:Assembly 'System.Threading.Channels' references assembly 'system.threading.tasks.extensions, v.', which is not present in the current database程序集“System.Threading.Channels”引用了程序集“system.threading.tasks.extensions, v.”,当前数据库中不存在该程序集
【发布时间】:2021-01-02 20:37:36
【问题描述】:

我正在尝试将 DLL 添加到 SQL Server:

CREATE ASSEMBLY ClassLibrary1
AUTHORIZATION dbo
FROM 'C:\Debug\ClassLibrary1.dll'
WITH PERMISSION_SET = UNSAFE
GO

你可以在这里看到我的 DLLs

但我收到此错误:

程序集“System.Threading.Channels”引用程序集“system.threading.tasks.extensions, version=4.2.0.0,culture=neutral, publickeytoken=cc7b13ffcd2ddd51.”,当前数据库中不存在。 SQL Server 尝试从引用程序集所在的同一位置定位并自动加载引用程序集,但该操作失败(原因:版本、区域性或公钥不匹配)。请将引用的程序集加载到当前数据库中,然后重试您的请求。

当所有引用的 DLL 都可用时,为什么会出现此错误?

【问题讨论】:

  • @DaleK 我的问题是为什么我应该得到这个错误?DLL 在文件夹内
  • @DaleK,理论上你是正确的。但是,如果您从文件路径创建程序集,并且所有引用的 dll 都在路径中,则 SQL 会手动将它们引入。我们可以争论你是否应该这样做,我会说不是 - 但对于一个快速而肮脏的测试它是有效的。

标签: sql-server dll .net-assembly sqlclr


【解决方案1】:

嗯,有趣 - 您创建程序集的方式应该自动创建扩展 dll。

几件事:

  • 我假设您已手动将所有 dll 复制到您的目录中。如果 所以确保 dll 的版本是正确的,即 通道 dll 使用的扩展版本是您拥有的版本 目录。
  • 也可能无法将扩展创建为 SQL 中的程序集,因为并非所有 clr dll 都是允许的。尝试创建 手动扩展 dll,然后是通道 dll。

有些 dll 很难部署到数据库中是有原因的 - 所以也许问问自己,您是否可以从数据库外部完成您想要使用 dll 执行的操作。每次我看到 dll 引用 System.Threading 和 System.Memory 时我都会担心。

哦,我知道你想做什么了 - 你想呼叫 Rabbit,我假设你使用的是最新的 rabbit 客户端 dll 之一。我有一个模糊的回忆,后来的 dll 无法部署到 SQL。实际上,我在 2017 年写了一篇关于如何做到这一点的博客文章。Have a look at the post,看看它是否对你有帮助。

【讨论】:

  • 嗨 Niles。我已将 dll 作为参考添加到我的解决方案中,并且当我构建项目时会自动将其复制到调试文件夹中。
  • 那么如果您尝试手动将其部署到数据库会发生什么?
  • 我手动添加了 system.threading.tasks.extensions 并且没问题。但是当我尝试添加我的 ClassLibrary1.dll 时出现同样的错误,为什么?
  • 好吧,然后按照上面@DaleK 的建议做,手动添加所有的dll,一个一个。
  • 抱歉我迟到了。当我尝试手动添加它们时,我收到此错误:Assembly 'system.runtime.compilerservices.unsafe, version=4.0.4.1,culture=neutral, publickeytoken=b03f5f7f11d50a3a.'在 SQL 目录中找不到。 (Microsoft SQL Server,错误:6503)
猜你喜欢
  • 2011-08-12
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
相关资源
最近更新 更多