我正在尝试在 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 尝试时的结果相同。
最佳答案
您正在尝试导入错误的 DLL。那是“引用”DLL,而不是实际的“框架”DLL。以下将起作用,因为我不仅使用 SQL Server 2012 尝试过它,而且还能够导入 System.IO.Compression.FileSystem
并执行 System.IO.Compression.ZipFile.CreateFromDirectory()
:
这是必需的,因为您无法创建
ASYMMETRIC KEY
来自 .Net Framework DLL:ALTER DATABASE [{dbname}] SET TRUSTWORTHY ON;
至少你需要这个:
CREATE ASSEMBLY [System.IO.Compression] FROM N'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.IO.Compression.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS;
如果您想使用 ZipFile或 ZipFileExtensions类,你将需要这个(不幸的是,这个需要设置为
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;
以防万一,调用上述程序集中方法的程序集也需要有一个
PERMISSION_SET
。的EXTERNAL_ACCESS
.对于可能不知道这一点的任何人来说,这是完全清楚的:
Zip*
类以及System.IO.Compression
和System.IO.Compression.FileSystem
程序集是 .Net 4.5 的新内容- 您只能在 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/