我在 SQL 2008 R2 上有一堆 SQL CLR 程序集。这些程序集的目标是 .Net Framework 3.5。鉴于 SQL 2008 支持 2.0 .NET 框架版本,我假设 SQL 从 System GAC 加载了安全程序集,并且预期将不安全程序集安装在 SQL 中。我对这些不安全程序集的引用是 .NET 2.0 版。现在,当我将此数据库恢复到 SQL 2012 时,我的 CLR 代码因“未找到对不安全程序集 4.0 版的引用”而失败。我不明白这个错误。2.0 版本的不安全系统程序集存在于 DB mdf 文件本身中。SQL 为什么要寻找 4.0?我想我错过了“SQL 支持 x 版本的 .NET 框架”的含义。
1 回答
我能够找到我所面临问题的根本原因。SQL 2012 支持用于 SQLCLR 的 .NET 框架 4.0 版,因此从 4.0 框架加载所有框架程序集。因此,我需要升级所有程序集以使用 4.0 框架程序集。http://blogs.msdn.com/b/dohollan/archive/2012/04/20/sql-server-2012-sqlclr-net-framework-version.aspx?CommentPosted=true#commentmessage
但即使在那之后,事情也对我不起作用。事实证明,在 4.0 中,.NET 将一些框架程序集(如 System.ServiceModel)从纯 .Net 程序集更改为混合模式程序集。SQL CLR 无法加载此类程序集。因此,所有依赖于 2012 年之前的混合模式程序集的用户定义程序集在 2012 年不再工作:( 最严重的打击是以前工作的 SQL 和 WCF 集成在 2012 年完全中断 sicne WCF 依赖于 ServiceModel。更多在这里http://blogs.msdn.com /b/psssql/archive/2013/02/23/unable-to-register-net-framework-assembly-not-in-the-supported-list.aspx
我们最终在 WCF 操作上编写了一个简单的 Web 服务包装器,并在 SQLCLR 中编写了一个 Web 服务客户端。