尝试从我使用CLR集成构建的用于SQL的DLL创建存储过程。我想我需要一个签名版本的 System.Net.Http 并在下面解释原因。任何建议或提示将不胜感激。
如果我使用命令
,解决方案可以100%运行ALTER DATABASE test2 SET TRUSTWORTHY ON
然后我使用以下命令创建程序集
CREATE ASSEMBLY [System.Net.Http]
AUTHORIZATION dbo
FROM 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll'
WITH PERMISSION_SET = UNSAFE;
GO
CREATE ASSEMBLY [CLRTest01]
AUTHORIZATION dbo
FROM 'C:\Windows\CLRTest01.dll'
WITH PERMISSION_SET = UNSAFE;
GO
由于我选择信任默认设置,我希望能够在不使用权限级别的情况下执行此操作' UNSAFE'而是使用' SAFE'。但是,当我尝试为依赖于System.Net.Http的CLRTest01执行此操作时,我遇到的问题是我的System.Net.Http看似无符号或格式错误。
CREATE ASSEMBLY [System.Net.Http]
AUTHORIZATION dbo
FROM 'C:\Windows\System.Net.Http.dll'
WITH PERMISSION_SET = SAFE;
GO
使用v4.0_2.0.0.0__b03f5f7f11d50a3a时出错 - Assembly&System; Net.Http'无法安装,因为现有政策会阻止其被使用。
使用v4.0_4.0.0.0__b03f5f7f11d50a3a时出错 - CREATE ASSEMBLY失败,因为键入' System.Net.Http.HttpContent'在安全装配' System.Net.Http'有一个静态字段' EncodingsWithBom'。安全程序集中静态字段的属性必须在Visual C#,Visual Basic中的ReadOnly或Visual C ++和中间语言中的initonly中标记为只读。
这让我相信我需要一个签名版本的 System.Net.Http 。
答案 0 :(得分:3)
所有.NET Framework库都已签名。问题是您需要在[master]
中使用用于签署该程序集的强名称密钥(SNK)或证书(CER)的公钥创建非对称密钥或证书(通常是程序集具有被强烈命名的和用证书签名。)
您可以执行以下操作以避免TRUSTWORTHY
(which is absolutely the right thing to do):
USE [master];
CREATE CERTIFICATE [MS.NETcer]
FROM EXECUTABLE FILE =
'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll';
CREATE LOGIN [MS.NETcer] FROM CERTIFICATE [MS.NETcer];
GRANT UNSAFE ASSEMBLY TO [MS.NETcer];
然后你可以这样做:
USE [SomeDatabase];
CREATE ASSEMBLY [System.Net.Http]
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll'
WITH PERMISSION_SET = UNSAFE;
除此之外,由于您发布的错误消息,您将无法将PERMISSION_SET = SAFE
与 System.Net.Http 一起使用:
在安全程序集“System.Net.Http”中输入'System.Net.Http.HttpContent'有一个静态字段'EncodingsWithBom'。安全程序集中静态字段的属性必须在Visual C#,Visual Basic中的ReadOnly或Visual C ++和中间语言中的initonly中标记为只读。
因为您无法将该静态字段标记为readonly
并重新编译,所以您会被UNSAFE
困住。
有关一般使用SQLCLR的更多信息(包括有关设置Visual Studio以处理证书签名的说明,甚至在SQL Server 2017中的工作,这比以前的版本更严格):