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

标签 c# .net 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

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

Error prompt from SSMS

最佳答案

您正在尝试导入错误的 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;
    
  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;
    
  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;
    
  4. 以防万一,调用上述程序集中方法的程序集也需要有一个 PERMISSION_SET。的 EXTERNAL_ACCESS .

  5. 对于可能不知道这一点的任何人来说,这是完全清楚的:

    1. Zip*类以及 System.IO.CompressionSystem.IO.Compression.FileSystem程序集是 .Net 4.5 的新内容
    2. 您只能在 SQL Server 2012 和 2014(当前版本)中使用 .Net 4.0/4.5 的新项目; SQL Server 2005/2008/2008 R2 卡在.Net 2.0 系列上。

关于c# - 无法将 System.IO.Compression 添加到 SQL Server 中的受信任程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835036/

相关文章:

C# - 在 block 末尾自动释放内存

c# - 如何用 Device.OnPlatform 翻译这个 Padding? (iOS 案例)

c# - 从 Xamarin 调用 PutAsJsonAsync 的异常

c# - 如何在一个 .NET 解决方案中跨项目进行通信?

asp.net - 如何调查 ASP.net 应用程序上的 SQL Server 超时错误?

sql - 如何处理 SQL Server Select 查询中的特殊字符

c# - 使用对象的列表遍历对象

c# - ListView ItemActivate 延迟

mysql - 数据库连接MySQL或Berkeley DB

c# - 无法通过 EasyNetQ 连接 RabbitMQ,拒绝用户 guest 访问