newtonsoft.json SQL Server 2008 R2 的 C# CLR 中的解析器 - 如何部署?

newtonsoft.json parser in a C# CLR for SQL Server 2008 R2 - How to deploy?

我创建了一个 CLR,它使用 newtonsoft json parser.

我需要部署 CLR。我为解析器依赖创建了一个程序集:

CREATE ASSEMBLY [Newtonsoft.Json] FROM 'C:\share\Release\Newtonsoft.Json.dll' WITH PERMISSION_SET = UNSAFE

以上语句报错:

`Assembly 'Newtonsoft.Json' references assembly 'system.runtime.serialization, version=3.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089.', which is not present in the current database. SQL Server attempted to locate and automatically load the referenced assembly from the same location where referring assembly came from, but that operation has failed (reason: 2(failed to retrieve text for this error. Reason: 15105)).` Please load the referenced assembly into the current database and retry your request.

我正在使用 parser 的版本 7.xx。 我的目标是 .NET 3.5

CLR 部署到 sql server 2008 r2 的正确步骤是什么?

抱歉,我在评论中做出了错误的假设。默认情况下,SQL CLR 仅支持 GAC 中的 certain libraries

为了使用该库,您还需要明确添加它。

CREATE ASSEMBLY System_Runtime_Serialization FROM 'C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\System.Runtime.Serialization.dll'
WITH PERMISSION_SET = UNSAFE
GO

如果您使用的是 64 位 SQL 服务器,请确保使用 Framework64 而不是 Framework。

只是在瓶子里留下一张纸条,因为我只是 运行 到 Sql 服务器的这一部分 upgrade/move 到另一个系统。

较新版本的 Sql 服务器对加载到数据库中的程序集更加严格。

我们有一个使用 Newtonsoft.json 7.0.1 的程序集,在我用证书对其签名后,该程序集加载正常。

然后我尝试将 Newtonsoft 升级到 11.0.2。如此处所述,这导致了对 System.Runtime.Serialization 的依赖。

该程序集的路径与上面的答案不同:

C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Runtime.Serialization\v4.0_4.0.0.0__b77a5c561934e089\System.Runtime.Serialization.dll

然后发现System.Runtime.Serialization依赖于System.ServiceModel.Internals.dll。当我尝试将该程序集加载到 Sql Server 2019 时,它失败了,错误是用于签署该程序集的证书已过期。

因此,如果您继续使用 Newtonsoft.json 7.0.1,那么这里要解决的依赖项就会少很多。或者根据您需要的功能,也许 Utf8Json 或其他一些项目需要加载到 Sql Server

的依赖项更少

编辑:好的,这可能有 17 种不同的坏处,但我发现我之前的工作是...\packages\Newtonsoft.Json.7.0.1\lib\net20版本的文件。有人有点短路 nuget 管理器并将其锁定到那个。 加载到 Sql Server 2019 数据库程序集区域,而没有引用 System.Runtime.Serialization(或 System.ServiceModel.Internals),这导致了各种问题。

如果我将 packages.config 中的目标更改回 2.0 也没关系,它会尝试获取较新的框架 Newtonsoft dll 以匹配其他代码。

为了开心,我尝试升级到 Newtonsoft 11.0.2 并强制使用 net20 dll,并将其加载到 Sql Server 2019 而无需加载其他 .net 框架 dll .

不确定 Newtonsoft 的所有构建目标之间可能存在哪些功能差异,但加载 net20 目标似乎在​​将它们引入 Sql Server 2019 时附加的条件要少得多