SQL Server 2017部署CLR程序集遇System.Diagnostics.Tracing策略错误求助
我开发了一个C# CLR程序集,计划部署到SQL Server 2017(14.0.3048.4)环境。程序集目标框架为.NET Framework 4.8(服务器已安装版本4.8.03761,内部版本528049),开发工具使用Visual Studio 2022(17.8.3)。
执行CREATE ASSEMBLY命令部署.dll文件时,收到以下警告与错误:
警告:你正在注册的Microsoft .NET Framework程序集'system.diagnostics.tracing, version=4.2.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a'未在SQL Server托管环境中充分测试,不受支持。未来若升级或更新该程序集或.NET Framework,CLR集成例程可能停止工作。详情请参阅SQL Server联机丛书。
Msg 6586, Level 16, State 1, Line 77 Assembly 'System.Diagnostics.Tracing' could not be installed because existing policy would keep it from being used.
我理解该警告,但不确定是否需要担忧,现在希望成功部署CLR项目,请问如何(是否应该)绕过此错误?
背景
- 我认为自己使用的是最新版本的
system.diagnostics.tracing,因此版本不符的解决方案不适用(虽尝试过不同版本)。 - 曾考虑修改绑定重定向,但不确定是否有效,也未找到需要更新的文件。
- 怀疑问题源于
ClosedXML.Excel的使用——移除相关函数后项目可正常运行,但不确定是否确实是该程序集导致的。尝试降级到ClosedXML 0.97版本(看到有稳定性相关评论),但引发了其他问题,因此恢复到最新稳定版1.102,随即出现上述错误。 - 尝试过将CLR项目目标框架改为.NET 4.7.2,但无济于事。另外尝试添加
System.Diagnostics.Tracing引用,但该文件未出现在复制到服务器的bin/Release文件夹中。 - 已多次添加、移除并重新添加所有能想到的.dll至GAC。
解决方案
确认SQL Server兼容的程序集版本
SQL Server 2017的CLR托管环境默认适配.NET Framework 4.6.1及兼容的传统.NET Framework系统程序集,而你遇到的System.Diagnostics.Tracing 4.2.0.0属于.NET Standard/.NET Core相关版本,和SQL Server CLR环境存在兼容性冲突。优先使用.NET Framework版本的System.Diagnostics.Tracing(如4.0.0.0)。调整ClosedXML依赖
ClosedXML 1.x版本依赖的是.NET Standard生态的程序集,和SQL Server CLR不兼容,可尝试两种方案:- 回退到适配.NET Framework的ClosedXML版本:针对ClosedXML 0.97.x版本出现的问题,排查并修复依赖冲突或代码适配问题,该版本依赖传统.NET Framework程序集,更适合SQL Server CLR环境。
- 强制引用兼容版本的依赖:修改项目依赖,强制引用.NET Framework版本的
System.Diagnostics.Tracing,设置“复制本地”为true,确保该文件出现在bin/Release目录中,替换ClosedXML默认依赖的版本。
修改程序集版本策略(谨慎操作)
若必须使用当前版本的ClosedXML,可尝试绕过版本限制,但存在风险:- 先查看服务器上的程序集策略:
确认是否有针对SELECT * FROM sys.assembly_policiesSystem.Diagnostics.Tracing的版本限制策略。 - 若存在限制,删除对应的策略程序集(根据实际名称调整):
DROP ASSEMBLY [policy.4.2.System.Diagnostics.Tracing] - 重新执行
CREATE ASSEMBLY,并添加PERMISSION_SET = UNSAFE(ClosedXML通常需要较高权限):CREATE ASSEMBLY YourAssemblyName FROM 'C:\Path\To\Your\Assembly.dll' WITH PERMISSION_SET = UNSAFE;
注意:
UNSAFE权限会带来安全风险,后续.NET Framework升级可能导致CLR程序集失效,需做好测试和备份。- 先查看服务器上的程序集策略:
检查GAC中的程序集
确认服务器GAC中存在SQL Server兼容的System.Diagnostics.Tracing版本(4.0.0.0),可查看C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Diagnostics.Tracing目录。若存在高版本程序集,需调整项目引用至兼容版本。
内容的提问来源于stack exchange,提问作者High Plains Grifter

