【问题标题】:newtonsoft.json parser in a C# CLR for SQL Server 2008 R2 - How to deploy?SQL Server 2008 R2 的 C# CLR 中的 newtonsoft.json 解析器 - 如何部署?
【发布时间】:2016-02-21 01:29:28
【问题描述】:

我创建了一个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机器上安装了.net 3.5吗? System.Runtime.Serialization 应该在 GAC 中
  • 我怎么知道?根据:msdn.microsoft.com/en-CA/library/hh925568(v=vs.110).aspx,如果我检查 NDP 子项,我有所有 .Net 版本(2、3、3.5、4、4.5(完整))的条目。在添加和删除程序中,存在 .net 4.5.2。据我了解,SQL Server 2008 R2 使用 .Net 3.5。它是否正确?注意:如果我尝试在我的 CLR 构建中以 .NET 4.0 为目标,部署会失败并说明错误的 .NET 版本。

标签: c# .net json sql-server-2008-r2 sqlclr


【解决方案1】:

抱歉,我在评论中做出了错误的假设。 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 Server,请确保您使用的是 Framework64 而不是 Framework。

【讨论】:

  • 是的,就是这样。 (我试图注册一个不正确的 dll)。谢谢你
  • 这给了Assembly 'System_Runtime_Serialization' could not be installed because existing policy would keep it from being used.。应该怎么做才能让它发挥作用?
【解决方案2】:

只是在瓶子里留个便条,因为我只是在 Sql Server 升级/移动到不同系统的过程中遇到了这个问题。

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

我们有一个使用 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 时,加载它们似乎附带的字符串要少得多

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多