我有一个使用动态代码生成来创建代理类的项目。这个代理类利用了项目的内部类(这样就不会暴露实现细节),所以我使用 InternalsVisibleTo 和我动态生成的程序集的名称。直到最近,当我的客户强制要求所有已发布的程序集都必须具有强名称时,这才正常工作。
出现问题的原因是,为了将 InternalsVisibleTo 与强名称程序集一起使用,它引用的程序集也必须是强名称的,并且您必须提供公钥。我遇到困难的地方是如何为动态生成的程序集提供一个强名称。这是我到目前为止所做的:
- 我已经为动态程序集创建了一个新的密钥对,以便 .snk 可以随产品一起提供(显然我们不想提供 .snk 用于对项目程序集的其余部分进行签名。)
- 我已经提取了 PublicKey 并更新了 InternalsVisibleTo 以将新的动态 PublicKey 用于动态引用的程序集。
我试图像这样签署动态生成的程序集:
var name = new AssemblyName("ProxyBuilderAssembly"); var attributes = new CustomAttributeBuilder[1]; attributes[0] = new CustomAttributeBuilder(typeof(AssemblyKeyFileAttribute).GetConstructor(new[] {typeof(string)}), new object[] {"Dynamic.snk"}); _assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave, attributes); _module = _assembly.DefineDynamicModule("ProxyBuilderAssembly", "ProxyBuilderAssembly.dll");
不幸的是,这不起作用,我一直很难找到任何关于它应该如何工作的文档。有谁知道如何签署动态生成的程序集,以便可以通过 InternalsVisibleTo 对其进行访问?我可以将必要的类公开,但最终会泄漏最好封装的实现细节。