我有一个在某些SSIS脚本任务中使用的C#.NET 3.5类库(DLL),因此必须将其加载到GAC,这意味着它必须已签名.我创建了一个密钥并签署了DLL,它在SSIS中工作.
现在我还想将此DLL加载到SQL服务器,并创建一些引用此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.
如果我构建我的<<<<<<<<<” REFERENCED_DLL>>汇编并且不签名,项目发布正常,功能按预期工作.我尝试签署我的数据库项目,并将AllowPartiallyTrustedCallers添加到引用的DLL.
我真的想要只有一个版本的这个DLL,可以在GAC和SQL服务器中使用.我怎样才能做到这一点?
最佳答案 为了安全性和稳定性,SQLCLR只能访问一小部分经批准的GAC组件.所有其他必须在数据库中明确注册.
见https://msdn.microsoft.com/en-us/library/ms403279(v=sql.105).aspx
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