无法将System.IO.Compression添加到SQL Server中的受信任程序集

wpf*_*abe 4 .net c# sql-server ssms sqlclr

我试图在NET 4.5中创建一个SQLCLR存储过程,摆弄ZIP文件.显然System.IO.Compression不在SQL Server的批准列表上,但这是我尝试通过SQL Server Management Studio手动添加它时得到的.如果我尝试CREATE ASSEMBLY通过查询执行,也会发生同样的情况.有任何想法吗?为什么这是禁忌?

我也尝试在SSMS中运行此命令:

CREATE ASSEMBLY SystemIOCOMPRESSION
  FROM 'C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.IO.Compression.dll'
  WITH PERMISSION_SET = EXTERNAL_ACCESS
Run Code Online (Sandbox Code Playgroud)

...结果与我通过SSMS UI尝试的结果相同.

来自SSMS的错误提示

Sol*_*zky 7

您正在尝试导入错误的DLL.这是"引用"DLL,而不是实际的"框架"DLL.以下将工作,因为我不仅尝试使用SQL Server 2012,但我还能够导入System.IO.Compression.FileSystem和执行System.IO.Compression.ZipFile.CreateFromDirectory():

  1. 这是必需的,因为您无法ASYMMETRIC KEY从.Net Framework DLL 创建:

    ALTER DATABASE [{dbname}] SET TRUSTWORTHY ON;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 至少你需要这个:

    CREATE ASSEMBLY [System.IO.Compression]
    FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.dll'
    WITH PERMISSION_SET = EXTERNAL_ACCESS;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果你想使用ZipFileZipFileExtensions类,你将需要这个(UNSAFE不幸的是,这个需要设置为):

    CREATE ASSEMBLY [System.IO.Compression.FileSystem]
    FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.FileSystem.dll'
    WITH PERMISSION_SET = UNSAFE;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 万一不是很明显,你的组件调用上述组件的方法还需要有一个PERMISSION_SETEXTERNAL_ACCESS.

  5. 对于可能没有意识到这一点的人来说,要完全清楚:

    1. 从.Net 4.5开始,Zip*System.IO.CompressionSystem.IO.Compression.FileSystem程序集都是新的
    2. 您只能在SQL Server 2012和2014(当前版本)中使用.Net 4.0/4.5的新项目; SQL Server 2005/2008/2008 R2停留在.Net 2.0系列上.