我有一个用于某些 SSIS 脚本任务的 C# .NET 3.5 类库 (DLL),因此必须将其加载到 GAC,这意味着必须对其进行签名。我创建了一个密钥并签署了 DLL,它在 SSIS 中工作。
现在我也想把这个DLL加载到SQL服务器,并创建一些CLR对象来引用这个DLL中类中的方法。我有一个 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。
我真的只想拥有一个可以在 GAC 和 SQL 服务器中使用的 DLL 版本。我怎样才能做到这一点?