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