SQL Server CLR与第三方SDK集成:缺少程序集System.Drawing时出错
本文关键字:程序集 System Drawing 出错 CLR Server 第三方 集成 SDK SQL | 更新日期: 2023-09-27 18:27:02
我正在开发一个解决方案,该解决方案将与第三方应用程序的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,版本=4.0.0.0,区域性=中性,公钥令牌=b03f5f7f11d50a3a.",其不存在于当前数据库中。SQL Server试图从引用程序集的同一位置定位并自动加载引用的程序集,但该操作失败(原因:2(系统找不到指定的文件)。请将引用的程序集中加载到当前数据库中,然后重试请求。
更进一步,如果我试图基于明显缺失的引用system.drawing创建一个不安全的程序集(请记住,我在目标数据库中确实将可信设置为true),我会得到以下错误:
程序集"System.Drawing"的CREATE ASSEMBLY失败,因为程序集"System.Drawing"未通过验证。检查引用的程序集是否是最新的,并且可以在数据库中执行(对于external_access或unsafe)。CLR验证程序错误消息(如果有)将跟随此消息
[:System.Drawing.Image::Finalize][mdToken=0x600000d][偏移量0x00000000]代码大小为零。(等等,相同的错误在系统中的不同方法上重复。绘图)
我已经在解决方案和目标SQL Server数据库之间匹配了.NET框架,这些框架与v4.0相匹配。老实说,我在这里不知所措,这似乎比它应该做的要困难得多。我甚至没有直接引用System.Drawing,但我出于某种奇怪的原因需要它。
虽然它可能并不总是按预期运行,但您应该能够将System.Drawing
加载到SQL Server中。您需要将Database设置为TRUSTWORTHY ON
(似乎已经设置了),并且需要在CREATE ASSEMBLY
语句中将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.30119''System.Drawing.dll
此外,您不需要担心.NET Framework版本,只要您使用的是绑定到正确CLR版本的版本,即4.0。也就是说,只要目标服务器已更新到该Framework版本,您就可以使用.NET Framework 4.5.2或4.6版本。