SQL Server 2017基于.NET Core DLL创建程序集时出现引用程序集缺失报错
问题根因
SQL Server 2017的CLR集成功能原生仅支持基于.NET Framework编译的托管程序集,完全不兼容.NET Core/.NET 5+版本构建的DLL。
你当前遇到的错误只是表象:SQL Server识别到你的DLL引用了.NET Core生态下的核心库system.runtime 4.2.2.0,但由于SQL Server内置的CLR宿主仅加载.NET Framework 4.x运行时,根本没有内置对应版本的Core运行时组件,因此才会提示找不到文件。就算手动把缺失的Core程序集全部加载到数据库中,最终也会因为运行时架构不兼容,无法正常执行CLR逻辑。
可落地的修复步骤
- 调整项目目标框架,替换原有.NET Core配置
把csproj中的<TargetFramework>netcoreapp3.1</TargetFramework>修改为SQL Server 2017完全兼容的.NET Framework 4.8版本(对应SQL Server内置CLR v4.0.30319的支持范围,向下兼容4.6.1及以上的.NET Framework版本),保留原有<PlatformTarget>x64</PlatformTarget>的配置,匹配64位SQL Server的进程架构要求。 - 移除不兼容的NuGet依赖
原有引用的Microsoft.SqlServer.SqlManagementObjects 161.46041.41是面向.NET Core/.NET Standard构建的版本,不符合CLR集成SAFE权限集的加载要求。这类面向服务器管理的SMO程序集本身也不适合直接部署在CLR环境中,若确需使用相关功能,需匹配对应.NET Framework版本的SMO包,同时把程序集的权限集从SAFE调整为EXTERNAL_ACCESS,更推荐将这类高权限逻辑从CLR程序集中剥离,放到独立的外部应用层执行,避免不必要的安全风险。 - 补充CLR程序集的必要配置
SQL Server要求加载的CLR程序集必须经过强名称签名,需要在csproj中增加签名配置,指定项目对应的强名称密钥(.snk)文件,避免加载时触发签名校验失败。 - 调整数据库端的配置(仅当使用EXTERNAL_ACCESS权限时需要)
若最终程序集需要访问外部资源,除了调整权限集为EXTERNAL_ACCESS,还需要将目标数据库的TRUSTWORTHY属性设置为ON,或者通过给程序集对应的数字证书创建登录映射的方式,满足权限校验要求。
注意:不要尝试按照错误提示的指引,逐个手动把.NET Core依赖的BCL程序集加载到SQL Server中,这条路完全无法走通,最终会因为运行时不兼容持续报错,且存在极高的安全隐患。
内容的提问来源于stack exchange,提问作者Amir M
相关产品推荐
相关产品推荐

