【问题标题】:SQL Server CLR integration with 3rd party SDK: Error on missing assembly System.DrawingSQL Server CLR 与第 3 方 SDK 集成:缺少程序集 System.Drawing 时出错
【发布时间】:2016-03-23 06:14:47
【问题描述】:

我正在开发一种解决方案,该解决方案将与第三方应用程序的 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 语句创建程序集时,出现以下错误:

Assembly 'MyAssembly' 引用了程序集 'system.drawing, version=4.0.0.0,culture=neutral, publickeytoken=b03f5f7f11d50a3a.',它在当前数据库中不存在。 SQL Server 试图从引用程序集所在的同一位置定位并自动加载引用程序集,但该操作失败(原因:2(系统找不到指定的文件。))。请将引用的程序集加载到当前数据库中,然后重试您的请求。

更进一步,如果我尝试根据明显缺失的引用 system.drawing 创建一个不安全的程序集(请记住,我确实在目标数据库中将 trustworthy 设置为 true),我会收到以下错误:

为程序集“System.Drawing”创建程序集失败,因为程序集“System.Drawing”验证失败。检查引用的程序集是否是最新的并且受信任(对于 external_access 或不安全)以在数据库中执行。如果有任何 CLR 验证程序错误消息将跟随此消息
[ : System.Drawing.Image::Finalize][mdToken=0x600000d][offset 0x00000000] 代码大小为零。 (等,等相同的错误在system.drawing中的不同方法上重复)

我已经拥有在解决方案和目标 SQL Server 数据库之间匹配到 v4.0 的 .NET 框架。老实说,我在这里不知所措,这似乎比应该做的要难得多。我什至没有直接引用 System.Drawing,但出于某种奇怪的原因我需要它。

【问题讨论】:

    标签: c# .net visual-studio-2013 sql-server-2014 sqlclr


    【解决方案1】:

    虽然它可能并不总是按预期运行,但您应该能够将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 版本 4.5.2 或 4.6,只要目标服务器已更新到该 Framework 版本。

    【讨论】:

    • 好的,关于参考程序集:我看到 system.drawing 参考的文件路径是“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0 ”。实际 DLL 通常使用什么文件路径?
    • @user3140908 我刚刚用正确的路径更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 2020-12-13
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2017-04-27
    相关资源
    最近更新 更多