SQL Server与第三方SDK的CLR集成:缺少System.Drawing程序集错误

3

我正在开发一个解决方案,该解决方案将与第三方应用程序的SDK进行接口,并最终创建数据集以将数据迁移至我们SQL Server 2014实例上的目标数据库。此接口是通过SQL Server CLR存储过程实现的。在C#方面创建CLR程序集时使用了以下参考资料:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
    using (3rd party SDK);
    using System.Dynamic;

代码可以正确构建。但是,当我尝试使用“CREATE ASSEMBLY”语句创建一个程序集时,出现以下错误:
程序集“MyAssembly”引用程序集“System.Drawing,version=4.0.0.0,culture=neutral,publickeytoken=b03f5f7f11d50a3a。”,该程序集不存在于当前数据库中。SQL Server试图从引用程序集来自的相同位置定位并自动加载所引用的程序集,但该操作失败了(原因:2(系统找不到指定的文件。))。请将所引用的程序集加载到当前数据库中,然后重试您的请求。
进一步说,如果我基于似乎缺少的引用-System.Drawing尝试创建不安全的程序集(请记住,在目标数据库中,我确实将trustworthy设置为true),则会出现以下错误:CREATE ASSEMBLY for assembly 'System.Drawing' failed because assembly 'System.Drawing' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database. CLR Verifier error messages if any will follow this message[: System.Drawing.Image::Finalize][mdToken=0x600000d][offset 0x00000000] Code size is zero.(等等,等等。在system.drawing中的不同方法上重复出现相同的错误)
我已经将解决方案和目标SQL Server数据库匹配到v4.0的.NET框架。我真的很困惑,这看起来比应该的要难得多。我甚至没有直接引用System.Drawing,但出于某种奇怪的原因,我需要它。
1个回答

2
虽然它可能不总是按预期行事,但您应该能够将System.Drawing加载到SQL Server中。您需要将数据库设置为TRUSTWORTHY ON(似乎您已经这样做了),并且需要在CREATE ASSEMBLY语句中标记程序集为UNSAFE(即使用WITH PERMISSION_SET = UNSAFE子句)。
如果仍然出现错误,请确保加载的是实际的System.Drawing DLL而不是其中一个引用程序集,并确保获取正确的32位或64位版本。
对于CLR版本4.0(由SQL Server 2012及更高版本使用),程序集路径应该是以下两个选项之一,具体取决于您是否需要32位或64位版本:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Drawing.dll
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Drawing.dll
此外,只要您使用的.NET Framework版本绑定到正确的CLR版本(即4.0),就不必担心.NET Framework版本。也就是说,您可以使用.NET Framework版本4.5.2或4.6,只要目标服务器已更新到该框架版本即可。

关于参考程序集的问题:我看到系统绘图参考的文件路径是“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0”。实际 DLL 通常使用什么文件路径? - BRed2029
@user3140908 我刚刚更新了我的答案,应该是正确的路径。 - Solomon Rutzky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接