VS2019发布SQLCLR类库时提示System.Drawing不受信任如何解决
SQLCLR部署System.Drawing不受信任报错解决方案
完整报错信息:
(47,1): SQL72014: .Net SqlClient Data Provider: 消息 10327,级别 14,状态 1,第 1 行 程序集 'SqlClassLibrary' 的 CREATE ASSEMBLY 操作失败,因为程序集 'System.Drawing' 不受信任。满足以下任一条件时程序集将被视为受信任:程序集使用证书或非对称密钥签名,且其对应的登录名拥有UNSAFE ASSEMBLY权限;或已使用sp_add_trusted_assembly将该程序集添加到信任列表。
排查解决步骤
- 第一步:校验System.Drawing哈希匹配性
sp_add_trusted_assembly依赖SHA512哈希校验程序集身份,版本、架构(32/64位)不一致都会导致哈希不匹配,执行以下操作校验:- 查询服务器现有可信System.Drawing的哈希:
SELECT * FROM sys.trusted_assemblies WHERE description LIKE '%System.Drawing%' - 用PowerShell查询你项目引用的System.Drawing.dll哈希,路径替换为你本地dll的实际路径:
Get-FileHash -Path "C:\你的项目路径\bin\Release\System.Drawing.dll" -Algorithm SHA512 - 二者不一致则先删除旧的可信条目,重新添加正确版本:
EXEC sp_drop_trusted_assembly '查询到的旧哈希值' EXEC sp_add_trusted_assembly 0x新哈希值, N'System.Drawing, 版本=xxx, 文化=neutral, 公钥Token=b03f5f7f11d50a3a'
- 查询服务器现有可信System.Drawing的哈希:
- 第二步:调整VS2019发布配置
VS默认发布逻辑会忽略服务器端已配置的可信程序集规则,需手动修改发布设置:- 右键数据库项目选择【发布】,点击弹出窗口的【高级】按钮
- 在常规标签页找到忽略与受信任程序集相关的检查选项,勾选后保存
- 回到项目属性→数据库设置→权限标签,确认程序集权限级别设置为UNSAFE
- 第三步:检查CLR严格安全性配置
SQL Server 2017及以上版本默认启用CLR严格安全性,除了依赖的System.Drawing,你自己的SqlClassLibrary程序集也需要满足可信要求:- 可直接将你自己的程序集也添加到可信列表,操作逻辑同System.Drawing
- 测试场景可临时关闭CLR严格安全性(生产环境不推荐):
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr strict security', 0; RECONFIGURE;
- 第四步:手动执行部署脚本
上述配置都生效后仍报错的话,点击VS发布窗口的【生成脚本】按钮,手动修改生成的SQL脚本,删除尝试重新注册System.Drawing的逻辑,直接执行你自己程序集的创建语句即可。
内容的提问来源于stack exchange,提问作者Simple Simon
相关产品推荐
相关产品推荐

