GAC中的SQLCLR函数和System.Runtime.Serialization

JIb*_*568 5 .net sql-server gac sqlclr sql-server-2012

我在C#中构建了一个SQLCLR函数,该函数将反序列化JSON并返回一个表。

我遇到的问题是在SQL Server 2012中获取正确的程序集。

为了利用Newtonsoft的反序列化器,我不得不向SQL Server添加以下程序集:

System.ServiceModel.Internals.dll
SMDiagnostics.dll
System.Runtime.Serialization.dll
Newtonsoft.Json.dll
Run Code Online (Sandbox Code Playgroud)

这一切都按计划进行,但是当我尝试运行函数时,出现以下错误:

System.IO.FileLoadException:无法加载文件或程序集“ System.Runtime.Serialization,版本= 4.0.0.0,文化=中性,PublicKeyToken = b77a5c561934e089”或其依赖项之一。主机存储区中的程序集与GAC中的程序集具有不同的签名。(来自HRESULT的异常:0x80131050)有关更多信息,请参见Microsoft知识库文章949080。---> System.IO.FileLoadException:无法加载文件或程序集'System.Runtime.Serialization,版本= 3.0.0.0,区域性=中性,PublicKeyToken = b77a5c561934e089'或其依赖项之一。主机存储区中的程序集与GAC中的程序集具有不同的签名。(来自HRESULT的异常:0x80131050)有关更多信息,请参见Microsoft知识库文章949080。

服务器已安装.NET 4,而我尝试添加的DLL是从该服务器中获取的。但是,C:\ Windows \ assembly中显示的DLL是版本3.0.0。

我使用Powershell更新了GAC中的DLL,但这仅更新了位于C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL中的DLL。

我到底如何在C:\ Windows \ assembly(我假设这是SQL Server与之进行比较的地方)处获得GAC以反映正确的程序集?

任何帮助是极大的赞赏。

Abe*_*Abe 6

在SQL中运行此脚本,这应该可以解决问题

从'C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ System.Runtime.Serialization.dll'更改[System.Runtime.Serialization]

  • 谢谢你!我基本上做了:`CREATE ASSEMBLY [System.Runtime.Serialization]``FROM'C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ System.Runtime.Serialization.dll'`PERMISSION_SET = UNSAFE`GO ` (3认同)

JIb*_*568 2

终于设法让这个工作了。不确定这个答案对其他人有多大帮助,但我不得不使用一些来自不同来源的 dll 的组合。

基本上,我从本地计算机获取所有 dll,并将它们复制到服务器,然后尝试对本地文件和 .Net 框架内的文件进行引用组合。

最后,我不得不从服务器上的 .Net 引用 1 个 dll,其余的则从我的本地计算机复制。

这让它工作起来,然后在转移到生产服务器时也工作起来。这不是最简单的解决方案,但我可以建议处于类似情况的任何人只是尝试使用各种参考组合。