c#-用于动态生成的程序集的InternalsVisibleTo,但具有强大的命名能力
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-用于动态生成的程序集的InternalsVisibleTo,但具有强大的命名能力,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1792字,纯文字阅读大概需要3分钟。
内容图文
![c#-用于动态生成的程序集的InternalsVisibleTo,但具有强大的命名能力](/upload/InfoBanner/zyjiaocheng/672/a2f50f5f2b574661a55903b89785e961.jpg)
我有一个使用动态代码生成来创建代理类的项目.此代理类使用项目的内部类(这样就不会暴露实现细节),因此我将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对其进行访问吗?我可以将必要的类公开,但这最终会泄漏实现细节,最好将其封装起来.
解决方法:
MSDN上有一篇“ How to: Use Full Signing to Give a Dynamic Assembly a Strong Name”文章,显示了如何对使用Reflection.Emit生成的程序集进行签名.
StrongNameKeyPair kp;
// Getting this from a resource would be a good idea.
using(stream = GetStreamForKeyPair())
{
kp = new StrongNameKeyPair(fs);
}
AssemblyName an = new AssemblyName();
an.KeyPair = kp;
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
内容总结
以上是互联网集市为您收集整理的c#-用于动态生成的程序集的InternalsVisibleTo,但具有强大的命名能力全部内容,希望文章能够帮你解决c#-用于动态生成的程序集的InternalsVisibleTo,但具有强大的命名能力所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。