VS2015中SQL CLR项目目标.NET版本选择问题求助
首先明确:你的SQL Server CLR运行时已经初始化到v4.0.30319(对应.NET Framework 4.0),所以必须目标.NET Framework 4.0来构建你的SQL CLR项目,3.5版本的程序集和当前CLR运行时不兼容,这也是你遇到Msg 6586错误的核心原因。
为什么3.5版本不行?
SQL Server的CLR运行时在4.0模式下,有严格的程序集版本绑定政策。当你尝试部署基于.NET 3.5的程序集时,它依赖的System.Runtime.Serialization是3.5版本,而SQL Server的4.0 runtime会拒绝加载这个旧版本的系统程序集,触发政策冲突,也就是你看到的:
Msg 6586, Level 16, State 1, Line 8 Assembly 'System.Runtime.Serialization' could not be installed because existing policy would keep it from being used.
如何用.NET 4.0解决部署问题?
你之前尝试用.NET 4.0构建但SQL拒绝安装System.Runtime.Serialization,大概率是因为你错误地尝试手动部署这个系统程序集,或者引用的版本不对。正确的做法是:
确认项目引用的是.NET 4.0版本的
System.Runtime.Serialization
在Visual Studio 2015的SQL CLR项目中,右键引用→添加引用,找到System.Runtime.Serialization,确保它的版本是4.0.0.0,路径指向C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Runtime.Serialization.dll。不要手动部署
System.Runtime.Serialization到SQL Server
SQL Server的.NET 4.0 CLR运行时已经自带这个系统程序集,你只需要部署自己的CLR项目程序集,SQL Server会自动加载依赖的System.Runtime.Serialization,不需要单独执行CREATE ASSEMBLY来安装它。正确部署你的CLR程序集
确保CLR集成已开启,并且数据库有足够的权限(比如开启TRUSTWORTHY,或者用证书/非对称密钥进行权限授权,后者更安全)。示例SQL命令:-- 开启CLR集成 sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr enabled', 1; RECONFIGURE; -- (可选,若需要外部网络访问WCF服务)设置数据库为TRUSTWORTHY ALTER DATABASE YourTargetDatabase SET TRUSTWORTHY ON; -- 部署你的CLR程序集 CREATE ASSEMBLY YourCLRProjectName FROM 'C:\Path\To\Your\Compiled\Assembly.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS;检查程序集依赖版本
如果仍有问题,用ILDASM工具打开你编译后的CLR程序集,查看引用的System.Runtime.Serialization版本是否为4.0.0.0,确保没有混合引用旧版本的程序集。
内容的提问来源于stack exchange,提问作者joebohen

