C# 在SQL Server 2008R2中引用已签名程序集

C# 在SQL Server 2008R2中引用已签名程序集,c#,.net,visual-studio-2012,sql-server-2008-r2,sqlclr,C#,.net,Visual Studio 2012,Sql Server 2008 R2,Sqlclr,我有一个C#.NET 3.5类库(DLL),在某些SSIS脚本任务中使用,因此必须将其加载到GAC,这意味着必须对其进行签名。我创建了一个密钥并签署了DLL,它在SSIS中工作 现在我还想将此DLL加载到SQL server,并创建了一些引用此DLL中类中方法的CLR对象。我有一个VS2012数据库项目,并添加了对DLL的引用,将IsVisible和ModelAware属性设置为true。我扩展了UserDefinedFunctions类,添加了两个调用DLL中静态方法的函数 我的数据库项目中引

我有一个C#.NET 3.5类库(DLL),在某些SSIS脚本任务中使用,因此必须将其加载到GAC,这意味着必须对其进行签名。我创建了一个密钥并签署了DLL,它在SSIS中工作

现在我还想将此DLL加载到SQL server,并创建了一些引用此DLL中类中方法的CLR对象。我有一个VS2012数据库项目,并添加了对DLL的引用,将IsVisible和ModelAware属性设置为true。我扩展了UserDefinedFunctions类,添加了两个调用DLL中静态方法的函数

我的数据库项目中引用的程序集和CLR对象都设置为
SAFE
,因为它们不需要任何东西,只需要数据库中的内容

项目已生成,但发布到本地数据库时失败,出现以下奇怪错误:

Creating [<<REFERENCED_DLL>>]...
Creating [<<CURRENT_DATABASE_CLR>>]...
(288,1): SQL72014: .Net SqlClient Data Provider: 
   Msg 6218, Level 16, State 2, Line 1 
   CREATE ASSEMBLY for assembly '<<CURRENT_DATABASE_CLR>>' failed
   because assembly '<<CURRENT_DATABASE_CLR>>' failed verification. 
   Check if the referenced assemblies are up-to-date and trusted 
   (for external_access or unsafe) to execute in the database.
   CLR Verifier error messages if any will follow this message
[ : UserDefinedFunctions::sf_Function1][mdToken=0x6000001][offset 0x00000005]
   Unable to resolve token.
[ : UserDefinedFunctions::sf_Function2][mdToken=0x6000002][offset 0x00000005] 
   Unable to resolve token.
创建[]。。。
正在创建[]。。。
(288,1):SQL72014:.Net SqlClient数据提供程序:
Msg 6218,16级,状态2,第1行
为程序集“”创建程序集失败
因为程序集“”验证失败。
检查引用的程序集是否为最新且受信任的程序集
(用于外部访问或不安全)在数据库中执行。
CLR验证程序错误消息(如果有)将跟随此消息
[:UserDefinedFunctions::sf_Function1][mdToken=0x6000001][offset 0x00000005]
无法解析令牌。
[:UserDefinedFunctions::sf_Function2][mdToken=0x6000002][offset 0x00000005]
无法解析令牌。
疯狂的是,如果我构建了
程序集,但没有对其进行签名,那么项目就可以正常发布,函数也可以按预期工作。我尝试对数据库项目进行签名,并将
AllowPartiallyTrustedCallers
添加到引用的DLL中


我真的希望这个DLL有一个版本,既可以在GAC中使用,也可以在SQL server中使用。如何才能做到这一点?

为了安全性和稳定性,SQLCLR只能访问一小部分经批准的GAC程序集。所有其他文件必须在数据库中显式注册

SQL Server CLR仅允许从GAC加载以下内容:

CustomMarshalers
Microsoft.VisualBasic
Microsoft.VisualC
mscorlib
System
System.Configuration
System.Data
System.Data.OracleClient
System.Data.SqlXml
System.Deployment
System.Security
System.Transactions
System.Web.Services
System.Xml 

您是否已向数据库注册了强密钥

  • 如果主数据库中不存在主密钥,请在主数据库中创建主密钥:

    使用MASTER

    创建主密钥加密密码='您的_密码'

  • 在主数据库中为强密钥创建非对称密钥。您需要将.snk文件复制到数据库服务器,但一旦注册,就可以从服务器上删除它

    创建不对称密钥sqlkey FROM FILE='path_to_the_strong_name_KEY'

  • 从主数据库中的非对称密钥创建登录

    从非对称密钥yourkey创建登录yourlogin

  • 为刚刚创建的不安全程序集授予登录权限

    将不安全的程序集授予您的登录名

  • 我更喜欢直接从VisualStudio发布,但是您应该可以用它来做同样的事情

     CREATE ASSEMBLY yourSQLCLR
     FROM 'C:\\yourSignedSQLCLR.dll' 
     WITH PERMISSION_SET = UNSAFE | SAFE |  EXTERNAL_ACCESS
    

    非常感谢,尽管问题来自2013:-)我必须测试一下,以确定是否有办法向DB显式注册已签名程序集。。。要明确的是,我没有尝试加载GAC程序集-我正在尝试使用“创建程序集”将签名程序集加载到SQL Server中。@NWest-我没有注意到原始日期。我也不完全理解这个问题!我添加了一个本地的答案。我希望这会有帮助。