【问题标题】:What tool can change properties of existing assembly (assembly name in particular)?什么工具可以更改现有程序集的属性(特别是程序集名称)?
【发布时间】:2011-10-05 20:24:00
【问题描述】:

我试图混淆我的 silverlight 应用程序。它包含两个程序集,我正在使用混淆器的“合并程序集”功能。正在与主程序集 (A1) 合并的程序集 (A2) 具有资源,并且它是一个本地化程序集,因此有一个根据卫星文化特定程序集名称命名的相应本地化程序集 (A2loc)。

但是,在合并过程中,A2(带有资源的程序集)变为 M(A1+A2),并且 A2localized 不再是 M 的附属程序集,因为它具有旧的 A2 名称。我很确定我是否更改 A2loc 程序集属性以匹配新程序集命名为 M 它将起作用。

问题:例如可以使用哪个工具来获取现有程序集并修改其程序集名称?

当我简单地重命名附属程序集 A2loc 以匹配 M 程序集名称时,应用程序开始在加载时崩溃。

我描述了整个过程,因为也许有人可以提出更好的方法。

【问题讨论】:

    标签: .net silverlight localization .net-assembly satellite-assembly


    【解决方案1】:

    我能够从这里hacking assembly manifest解决以下解决方案

    使用 ildasm -> 转储 -> 编辑 IL 代码 -> ilasm -> 从编辑的 IL 代码生成新程序集

    这里是链接内容,以防万一它发生故障:

    我正在调试一个特别令人讨厌的问题,发现自己想要编辑已编译的 .NET 程序集的清单,以更改它所引用的程序集的版本号。不一定是最佳实践,但在这种情况下,它可以让我在没有两个小时的构建和部署周期的情况下确认确切的问题。事实证明,像这样令人讨厌的 hack 非常简单:

    运行 ILDASM,打开程序集并选择 File...Dump 以提取 IL 在 Visual Studio 中打开 IL 文件并编辑清单——在这种情况下,引用程序集的版本号很容易在文件顶部找到:

    // Metadata version: v2.0.50727
    .assembly extern mscorlib
    {
      .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
      .ver 2:0:0:0
    }
    .assembly extern x.y.z
    {
      .publickeytoken = (E4 21 0D 54 23 66 A2 B4 )                         // . .D'f..
      .ver 1:0:9:12
    }
    

    保存 IL 并使用 ILASM 重新组装 - 如果程序集已签名,请使用 ilasm /DLL x.y.z.il /KEY=x.y.z.snk 重新签名 确保新程序集与原始程序集具有相同的名称,并且它将作为完全替换运行,只是现在它的依赖项将用于修改后的版本。 Simon McEnlly 在 CodeProject 上的文章描述了进一步使用清单来更改方法的可见性,以及在没有源代码的地方修改和重建程序集。请注意,如果程序集已签名并且您没有强名称密钥来对其重新签名,则修改后的程序集将警告被篡改并且不会加载。

    【讨论】:

    • 链接好像失效了。您能否扩展您的答案,具体来说,您需要在 IL 代码中编辑哪些内容才能更改程序集名称?
    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2015-05-25
    • 2010-12-06
    • 2011-05-25
    相关资源
    最近更新 更多