无法在SQL中创建ASSEMBLY

时间:2011-11-01 14:34:17

标签: 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
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine]
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll'

但是我从MSSMSE收到此错误消息:

  

Msg 6218,Level 16,State 3,Line 1
  程序集“SQL_CLR”的CREATE ASSEMBLY失败,因为程序集“SQL_CLR”验证失败。检查引用的程序集是否正确   执行中的最新和可信(for external_access或unsafe)   数据库。 CLR Verifier错误消息(如果有)将遵循此   消息

5 个答案:

答案 0 :(得分:36)

我刚刚遇到了同样的问题。

这是一个旧页面,但首先是formost,最后,DLL 必须使用.NET 2.0构建。 SqlServer 2005是使用.net 2.0构建的,因为它是编写时的最新版本。 SqlServer 2008也可能存在同样的问题。

DLL和SqlServer必须都引用相同的.NET framekwork版本。一旦我想到了这一点,我在2.0和shazam下创建了一个单独的项目!第一次工作很完美。

要查看您的sql server使用的.net版本:

select * from sys.dm_clr_properties

答案 1 :(得分:8)

接受的答案,虽然似乎解决了O.P.的问题,但只是部分正确,并且对潜在原因提出了过于简单的解释,这可能导致其他人在错误的方向上遇到类似的问题。

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

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

CLR的单个版本通常具有与其一起使用的框架的多个版本。但是,单个版本的Framework仅适用于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版本与Framework版本关系的图表,请参阅.NET Framework Versions and Dependencies的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.Core System.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 版本, 框架版本。因此,请注意不要将报告2.0或4.0的两件事混淆为意味着您只能使用Framework 2.0或4.0版。

幸运的是,由于向后兼容性,针对CLR 2 Framework版本(2.0,3.0和3.5)编译的代码将运行,而无需在SQL Server 2012及更高版本中重新编译,即使它们位于CLR版本4上。

因此,使用Target Framework Version 2.0时通常不会出错,但是你肯定可以使用超过2.0的Framework版本。

要更深入地了解开发SQLCLR代码,请查看我写的以下文章(以及一般系列文章):

Stairway to SQLCLR Level 5: Development (Using .NET within SQL Server)

答案 2 :(得分:4)

USE master 
GO 
CREATE ASSEMBLY [Chapter2.FirstCLRRoutine] 
FROM 'D:\projeler\SQL_CLR\SQL_CLR\bin\Debug\SQL_CLR.dll' 
WITH PERMISSION_SET = UNSAFE

尝试一下,如果有效,请告诉我。

答案 3 :(得分:0)

CLR不支持库System.Environment: http://msdn.microsoft.com/en-us/library/ms403279.aspx

您仍然可以使用它,如上文“不支持的库”部分所示,但请记住,代码尚未经过安全性和可靠性测试。这可能会在生产环境中造成不可预测的结果,因此请在部署之前考虑风险并仔细测试。

此外,我认为它必须具有强名称,或者在执行之前部署到标记为“可信赖”的数据库。

答案 4 :(得分:0)

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

首先,您必须检查设置项目属性。在project属性中设置要为其创建CLR的sql server的版本。然后选择.Net Framework版本。例如,如果要为SQL Server 2008创建CLR,则必须将.Net Framework设置为3.5,而将2005设置为.Net 2.0。 我希望这个解决方案可以帮助你。