gpt4 book ai didi

c# - InternalsVisibleTo 用于动态生成的程序集,但具有强大的命名

转载 作者:行者123 更新时间:2023-11-30 15:45:42 29 4
gpt4 key购买 nike

我有一个使用动态代码生成来创建代理类的项目。这个代理类使用了项目的内部类(这样就不会暴露实现细节),所以我使用 InternalsVisibleTo 和我动态生成的程序集的名称。直到最近,我的客户要求所有装运的程序集都具有强名称,这一切都很好。

问题的出现是因为,为了将 InternalsVisibleTo 与强名称程序集一起使用,它引用的程序集也必须是强名称的,并且您必须提供公钥。我遇到困难的地方是如何为动态生成的程序集提供强名称。这是我到目前为止所做的:

  1. 我为动态程序集创建了一个新的 key 对,这样 .snk 就可以随产品一起发布(显然我们不想发布用于签署其余项目程序集的 .snk。)
  2. 我提取了 PublicKey 并更新了我的 InternalsVisibleTo 以将新的动态 PublicKey 用于动态引用的程序集。
  3. 我尝试像这样签署动态生成的程序集:

        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 用于动态生成的程序集,但具有强大的命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4936747/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com