C# 如何在SQL Server 2014中为SQL CLR注册PdfSharp?

C# 如何在SQL Server 2014中为SQL CLR注册PdfSharp?,c#,sql-server,sqlclr,C#,Sql Server,Sqlclr,我有一个CLR存储过程,它调用PdfSharp 1.32.3057.0从给定查询创建PDF。PdfSharp可以在本地开发服务器(Windows 2012/SQL server 2014)上注册,但不能在QA服务器(Windows 2008 r2/SQL server 2014)上注册 尝试在SA帐户下注册pdfsharp,该帐户是'util'db的dbo CREATE ASSEMBLY [PdfSharp] FROM 'c:\SqlClr\PdfSharp.dll' W

我有一个CLR存储过程,它调用PdfSharp 1.32.3057.0从给定查询创建PDF。PdfSharp可以在本地开发服务器(Windows 2012/SQL server 2014)上注册,但不能在QA服务器(Windows 2008 r2/SQL server 2014)上注册

尝试在SA帐户下注册pdfsharp,该帐户是'util'db的dbo

CREATE ASSEMBLY [PdfSharp] 
           FROM 'c:\SqlClr\PdfSharp.dll'
WITH PERMISSION_SET = UNSAFE
警告:Microsoft.NET Framework程序集'system.windows.forms,version=2.0.0.0,culture=neutral,publickeytoken=b77a5c561934e089,processorarchitecture=msil'。您注册的程序未在SQL Server托管环境中进行全面测试,不受支持。将来,如果升级或服务此程序集或.NET Framework,您的CLR集成例程可能会停止工作。有关详细信息,请参阅SQL Server联机丛书

Msg 6586,第16级,状态1,第118行
无法安装程序集“System.Windows.Forms”,因为现有策略将阻止使用该程序集

对于util db,
是否可信
设置为on

.NET 4.7.2和.NET 3.5.1都安装在QA服务器上

如何注册此程序集而不出错

  • .NET Framework版本3.5.1与此无关,因为您使用的是SQL Server 2014,该版本仅与CLR版本4.0(因此,.NET Framework版本4.0及更高版本,至少通过4.7.2)

  • 不知何故,您指向了错误版本的
    System.Windows.Forms
    库。错误状态为“system.windows.forms,version=2.0.0.0,…,它适用于CLR version 2.0,而不是CLR version 4.0。因此,您需要将.NET 4.x中的System.Windows.Forms.dll文件放入c:\SqlClr\中,以便在尝试加载PdfSharp时自动加载该文件

  • 您需要进行彻底的测试,让多个并发用户同时访问这个SQLCLR对象。我没有研究过PdfSharp,但如果它不安全的原因是因为使用静态类变量缓存性能值,那么这很容易导致奇怪、意外和不可预测的行为,因为SQL Server中的AppDomain在所有会话中共享。这意味着多个并发用户可以访问相同的静态类变量。这可能导致一个用户覆盖另一个用户正在使用的值的竞争条件。您需要尝试将PdfSharp加载为
    SAFE
    EXTERNAL\u ACCESS
    ,以查看返回的错误消息,该错误消息应至少指明此库需要标记为
    不安全的一个原因

    如果使用静态类变量缓存每次执行的值,则应:

  • 将“readonly”关键字添加到静态类变量声明中并重新编译。编译时,如果代码中有写入该变量的位置,它们将生成错误。您需要修复发生这种情况的每个地方。您可以尝试删除“static”关键字(显然不添加“readonly”),使其成为一个实例变量,这样使用起来很安全
  • 不要使用解决方案,而是寻找其他解决方案
  • 有关一般使用SQLCLR的更多信息,请访问:

  • .NET Framework版本3.5.1与此无关,因为您使用的是SQL Server 2014,该版本仅与CLR版本4.0(因此,.NET Framework版本4.0及更高版本,至少通过4.7.2)

  • 不知何故,您指向了错误版本的
    System.Windows.Forms
    库。错误状态为“system.windows.forms,version=2.0.0.0,…
    ,它适用于CLR version 2.0,而不是CLR version 4.0。因此,您需要将.NET 4.x中的System.Windows.Forms.dll文件放入c:\SqlClr\中,以便在尝试加载PdfSharp时自动加载该文件

  • 您需要进行彻底的测试,让多个并发用户同时访问这个SQLCLR对象。我没有研究过PdfSharp,但如果它不安全的原因是因为使用静态类变量缓存性能值,那么这很容易导致奇怪、意外和不可预测的行为,因为SQL Server中的AppDomain在所有会话中共享。这意味着多个并发用户可以访问相同的静态类变量。这可能导致一个用户覆盖另一个用户正在使用的值的竞争条件。您需要尝试将PdfSharp加载为
    SAFE
    EXTERNAL\u ACCESS
    ,以查看返回的错误消息,该错误消息应至少指明此库需要标记为
    不安全的一个原因

    如果使用静态类变量缓存每次执行的值,则应:

  • 将“readonly”关键字添加到静态类变量声明中并重新编译。编译时,如果代码中有写入该变量的位置,它们将生成错误。您需要修复发生这种情况的每个地方。您可以尝试删除“static”关键字(显然不添加“readonly”),使其成为一个实例变量,这样使用起来很安全
  • 不要使用解决方案,而是寻找其他解决方案
  • 有关一般使用SQLCLR的更多信息,请访问:

    1)这是个坏主意。您应该使用一个外部程序,可能只是通过SQL代理使用PowerShell来实现这一点

    2) 下面是怎么做的

    您尝试加载的程序集引用的.NET framework程序集不在SQL Server的“受祝福列表”中,这意味着它们未在proc中测试或支持运行。要使用它们,必须将它们复制到数据库中

    复制数据库中的.NET Framework程序集后,必须在主机上的.NET Framework版本更改(包括修补程序和次要版本更改)或数据更改时随时更新它们
    system.windows.forms, version=4.0.0.0, culture=neutral, publickeytoken=b77a5c561934e089, processorarchitecture=msil
    system.drawing, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a, processorarchitecture=msil
    accessibility, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a, processorarchitecture=msil
    system.runtime.serialization.formatters.soap, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a, processorarchitecture=msil
    
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319