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

时间:2016-01-13 17:14:02

标签: .net sql-server sql-server-2012 gac sqlclr

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

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

为了利用Newtonsoft的反序列化器,我必须将以下程序集添加到SQL Server中:

System.ServiceModel.Internals.dll
SMDiagnostics.dll
System.Runtime.Serialization.dll
Newtonsoft.Json.dll

这一切都按计划进行,但当我尝试运行我的功能时,我收到以下错误:

  

System.IO.FileLoadException:无法加载文件或程序集“System.Runtime.Serialization,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其中一个依赖项。主机存储中的程序集与GAC中的程序集具有不同的签名。 (HRESULT异常:0x80131050)有关详细信息,请参阅Microsoft知识库文章949080。 ---> System.IO.FileLoadException:无法加载文件或程序集System.Runtime.Serialization,Version = 3.0.0.0,Culture = neutral,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以反映正确的程序集?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

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

ALTER ASSEMBLY [System.Runtime.Serialization] FROM' C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ System.Runtime.Serialization.dll'

答案 1 :(得分:1)

最后设法让这个工作。不确定这个答案对其他人有多大帮助,但我不得不使用各种来源的dll混合。

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

最后,我必须在服务器上引用.Net中的1个dll,其余部分从我的本地机器中复制。

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

答案 2 :(得分:0)

(抱歉,由于它被标记的方式没有看到这一点)

我不建议在接受的答案中采用的方法,因为它不应该那么复杂。

SQL Server拥有自己的CLR主机,受到高度限制。它只能使用一个CLR版本。因此SQL Server 2005,2008和2008 R2链接到CLR 2.0和链接到它的.NET Framework版本(即2.0,3.0和3.5),而SQL Server 2012和更新版本链接到CLR 4.0和.NET Framework链接到它的版本(即4.0和更新版本)。所以,既然你是在2012年,我不确定为什么它甚至在错误信息中提到3.0,但它并没有尝试使用那个。

错误消息还提到了4.0版本,问题是签名不匹配。 SQL Server CLR主机的一个限制是加载到其中的任何程序集(如果也在GAC中找到)必须是完全相同的版本。这个问题的最可能原因是:

的某种组合
  1. 不知何故,服务器(即Windows操作系统)获得了.NET Framework更新,并且GAC没有得到刷新。不确定您是否在复制DLL之前尝试重新启动服务器,但可能已修复它,或者可能使用gacutil.exe强制卸载并重新加载当前版本的DLL,如 C中所示:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319

  2. 您的开发计算机所处的.NET Framework版本与部署SQLCLR程序集的版本不同。如果这些匹配最好。它还有助于确保在 .sqlproj 文件的“引用”部分中,系统DLL的标记没有设置“SpecificAttribute”属性。

    < / LI>
  3. 这是一个长镜头,但对于我帮助的至少两个系统来说一直是个问题:.NET Framework DLL可能“损坏”,在这种情况下,您需要进行.NET Framework修复。您可以从“控制面板”中执行此操作程序,或使用Microsoft的.NET Framework Repair Tool