【问题标题】:Loading assembly into SQL Server 2017 database将程序集加载到 SQL Server 2017 数据库中
【发布时间】:2019-09-01 08:53:34
【问题描述】:

我正在尝试将 CLR 程序集 Split.dll 加载到 SQL Server 2017 数据库中:

创建组件拆分 FROM 'D:\SqlClr\split.dll' WITH Permission_set = 安全 去吧

我已使用 Visual Studio 2019 构建了此程序集。但我收到此错误:

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

我尝试对 SQL Server 2014 和 Visual Studio 2015 执行相同的操作。实际上,我使用相同的 C# 代码来获取 DLL,并使用相同的 SQL 语句(如上所示)来加载它。在这种情况下,一切都运行良好。

我读过Sql Server CLR load assembly failed,但是当我尝试加载netstandard.dll时:

CREATE ASSEMBLY netstandard 
AUTHORIZATION dbo 
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\netstandard.dll' 
WITH Permission_set = SAFE
GO

我收到此错误:

消息 6212,第 16 级,状态 1,第 1 行
CREATE ASSEMBLY 失败,因为安全程序集“System.Diagnostics.Tracing”中类型“System.Diagnostics.Tracing.EventCounterGroup”的方法“EnsureEventSourceIndexAvailable”正在存储到静态字段。安全程序集中不允许存储到静态字段。

有人可以帮我吗?为什么相同的代码在 SQL Server 2014 和 Visual Studio 2015 中内置的 DLL 中运行良好,而我现在遇到问题(SQL Server 2017、Visual Studio 2019)?解决这个问题的方法是什么?

【问题讨论】:

  • 在 Microsoft 网站上查看此警告:warning
  • 你的函数会分割字符串吗?现在有一个本机函数可以做到这一点(虽然不确定它有多快)
  • @Luuk 非常感谢您的回复,但我已尝试 EXEC sp_configure 'clr strict security',0;
  • @Nick.McDermaid 选项是最好的,它可以避免迁移到 2021 版时出现问题????
  • 在新编译的程序集中查看目标框架是否从 .NET Framework 更改为 .NetStandard 或 .NET Core。我还想知道错误是否意味着它所说的 - 程序集入口退出 - 调用点是静态的“全局”而不是特定于实例。因此,不同的 SQL Spid 将写入完全相同的实例,因此会在运行时跨 Sql Server Spid 破坏和覆盖自身。

标签: .net sql-server sqlcl


【解决方案1】:

只是为了快速澄清,因为在我自己寻找解决方案的过程中,我必须多次回避这个问题。答案其实在上面的cmets中已经给出了……我只是一开始没有看cmets。问题是我选择了错误的框架。 .Net 标准框架显示在列表顶部...正确的框架位于列表的下方,因此很容易(至少对我而言)错过:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    相关资源
    最近更新 更多