未能在SQL中创建程序集

未能在SQL中创建程序集,sql,sql-server,sqlclr,Sql,Sql Server,Sqlclr,我已经深入研究了SQL clr编程。不幸的是,我的第一次尝试遇到了麻烦。 我的C#汇编代码就是这样: enter code here public partial class FirstCLRRoutines { public static int GetCLRFrameworkMajorVersion() { return System.Environment.Version.Major; } } SQL代码是: USE master GO CREAT

我已经深入研究了SQL clr编程。不幸的是,我的第一次尝试遇到了麻烦。 我的C#汇编代码就是这样:

enter code here
public partial class FirstCLRRoutines
{
    public static int GetCLRFrameworkMajorVersion()
    {
        return System.Environment.Version.Major;
    }
}
SQL代码是:

USE master
GO
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine]
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll'
但是我从MSSMSE收到了这个错误消息:

Msg 6218,第16级,第3状态,第1行
为程序集“SQL\U CLR”创建程序集失败,因为程序集“SQL\U CLR”验证失败。检查引用的程序集是否正确 最新且受信任(用于外部访问或不安全)可在中执行 数据库。CLR验证程序错误消息(如果有)将跟随此消息 信息


请尝试,然后告诉我是否有效。

CLR不支持库System.Environment:

您仍然可以使用它,正如上面文章的“不支持的库”部分所指出的,但是请记住,代码还没有经过安全性和可靠性测试。这可能会在生产环境中导致不可预测的结果,因此请考虑风险并在部署之前仔细测试


此外,我认为它必须有一个强名称,或者部署到一个标记为“可信”的数据库中,然后才能执行。

我刚刚遇到了完全相同的问题

这是一个旧页面,但首先,也是最后,DLL必须使用.NET 2.0构建。SQLServer2005是使用.NET2.0构建的,因为它是编写时可用的最新版本。SQLServer2008也可能有同样的问题

DLL和SqlServer都必须引用相同的.NET framekwork版本。一旦我弄明白了这一点,我在2.0和shazam下创建了一个单独的项目!第一次做得很好

要查看sql server使用的.net版本,请执行以下操作:

select * from sys.dm_clr_properties

公认的答案虽然似乎解决了共和党的问题,但只是部分正确,并对根本原因给出了过于简单的解释,这可能导致其他有类似问题的人走向错误的方向

接受答案的问题是对.NET环境的误解,同样的误解也可以在问题本身中看到。在.NET中,CLR和Framework是两个独立的东西,每个都有自己的版本

CLR(公共语言运行库)执行托管代码。这并不像框架那样经常更新。NET Framework是一组库,提供了与特定版本的CLR进行交互的基本方法

一个CLR版本通常有多个它所使用的框架版本。但是,该框架的单一版本仅适用于CLR的一个特定版本。例如,CLR版本2.0适用于Framework版本2.0、3.0和3.5,而CLR版本4.0适用于.NET Framework的所有4.x版本(即4.0、4.5、4.5.1、4.5.2、4.6等)。要查看CLR verion与框架版本之间的关系图,请参阅MSDN页面以了解

关于SQLCLR代码,SQL Server仅适用于单一版本的CLR,具体版本取决于SQL Server的版本。SQL Server 2005、2008和2008 R2仅适用于CLR版本2。由于CLR版本2仅适用于.NET Framework版本2.0、3.0和3.5,这意味着SQL Server 2005、2008和2008 R2仅适用于.NET Framework版本2.0、3.0和3.5。当然,SQL Server 2005只包括.NET Framework 2.0版,因此.NET Framework 3.0版和3.5版中有两个较新的库在SQL Server 2005中不工作,除非手动导入它们(即System.CoreSystem.Xml.Linq)。按照同样的思路,SQL Server 2012、2014和2016静态链接到CLR版本4,该版本与.NET Framework版本4.0、4.5、4.5.1、4.5.2和4.6一起使用

关于从
System.Environment.Version
(问题中)和
sys.dm_clr_properties.Version
(接受的答案中)返回的信息,他们报告的是clr版本,而不是Framework版本。因此,请注意不要混淆报告2.0或4.0这两件事,因为这意味着您只能使用框架版本2.0或4.0

幸运的是,由于向后兼容,针对CLR 2框架版本(2.0、3.0和3.5)编译的代码将运行,而无需在SQL Server 2012和更新版本中重新编译,即使它们在CLR版本4上也是如此

因此,使用2.0的目标框架版本通常不会出错,但可以肯定的是,可以使用2.0以外的框架版本

要更深入地了解开发SQLCLR代码,请参阅我编写的以下文章(以及本系列的一般内容):

简短回答: 在项目属性上设置Sql Server版本和.Net Framework版本

首先,必须选中“设置项目属性”。在项目属性中,设置要为其创建CLR的sql server版本。然后选择.NETFramework版本。例如,如果要为SQL Server 2008创建CLR,则必须将.Net Framework设置为3.5,并为2005选择.Net 2.0。
我希望这个解决方案能对您有所帮助。

public partial class FirstCLRRoutines{public static int GetCLRFrameworkMajorVersion(){return 12;}}}这不是真的
System.Environment
不是程序集:它是位于mscorlib.dll中的类(在
System
命名空间中),受支持(我在安全程序集中使用过)。它完全包含在
mscorlib
中,包括.NET 4.0,然后从.NET 4.5开始,在System.Runtime.Extensions.dll中有一些方法和/或属性,这些方法和/或属性不在支持的库列表中。请参阅MSDN页面以获取.public分部类FirstCLRRoutines{public static int GetCLRFrameworkMajorVersion(){return 12;}}这对于OP的规范不是必需的
select * from sys.dm_clr_properties