65.9K
CodeProject 正在变化。 阅读更多。
Home

编辑程序集的清单以及更多...

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (11投票s)

2005年6月18日

3分钟阅读

viewsIcon

88139

downloadIcon

411

一篇关于编辑程序集清单和一些其他 IL 属性的文章。

引言

本文将提供一个逐步指南,介绍如何编辑程序集的清单,并简要介绍修改程序集的简易程度。

问题

在较大的开发团队中工作意味着您可能并不总是可以访问特定程序集的源代码,或者即使可以访问,您也可能由于某种原因(例如,您在外地为客户服务)而无法对其进行编译。

我最近遇到了两个问题,我通过反汇编程序集、修改清单和 IL,然后重新汇编来解决了这些问题。

附加的代码(上面)有两个项目。第一个项目是一个使用类库的 WinForms 项目。该类库具有以下代码行

using System.Reflection;
using System.Runtime.CompilerServices;

[assembly: AssemblyVersion("1.0.1.0")]

public class TestClass
{
    public static decimal SquareNumber(decimal baseNumber)
    {
        return CalculatePower(baseNumber, 2);
    }

    private static decimal CalculatePower(decimal baseNumber, int exponent)
    {
        decimal returnValue = 1;

        for (int i = 0; i < exponent; i++)
            returnValue *= baseNumber;

        return returnValue;
    }
}

假设我们的类库在许多地方使用,并且我们正在重新编译它以修复先前版本中的问题。我们需要将其分发给我们的客户,但是我们针对错误的版本进行了编译,并且由于版本依赖性问题而无法使用新的程序集。

我们的 WinForms 应用程序中的一些新功能需要访问 CalculatePower 方法,但不幸的是,它具有 private 访问器。这意味着我们需要将其访问器更改为 public 而不是 private(见下文)。

MessageBox.Show (TestClass.CalculatePower(decimal.Parse(txtBase.Text), 
                 int.Parse(txtExponent.Text)).ToString(), 
                 "Result", 
                 MessageBoxButtons.OK, 
                 MessageBoxIcon.Information);

解决方案

值得庆幸的是,Microsoft 已经包含了使用 Visual Studio .NET 完成此操作所需的所有工具。

  1. 启动 Visual Studio .NET 2003 命令提示符。

    Visual Studio .NET Command Prompt

  2. 在命令提示符下,键入 ildasm <enter>。
  3. 打开您需要处理的程序集。在我们的例子中,这将是SatelliteAssembly.dll
  4. 打开文件后,选择“文件”->“转储”。确保所有复选框都已选中,然后单击“确定”。
  5. 系统将提示您将其另存为 IL 文件。我建议创建一个新目录来保存。另存为SatelliteAssembly.IL(然后关闭 ILDASM)。
  6. 在您喜欢的编辑工具(我使用 Visual Studio .NET 2003)中打开SatelliteAssembly.IL
  7. 查找如下所示的 IL 代码
    .assembly /*20000001*/ SatelliteAssembly
    {
      // --- The following custom attribute is added
      //                   automatically, do not uncomment -------
      //  .custom /*0C000001:0A000002*/ instance void [mscorlib/* 23000001 */]
      //         System.Diagnostics.DebuggableAttribute/* 01000004 */::.ctor(bool,
      //         bool) /* 0A000002 */ = ( 01 00 01 01 00 00 ) 
      .hash algorithm 0x00008004 
      .ver 1:0:1:0
    }
  8. 将版本 1:0:1:0 (1.0.1.0) 更改为 2:0:1:0 (2.0.1.0)。
  9. 查找如下所示的 IL 代码
      .method /*06000002*/ private hidebysig static 
              valuetype [mscorlib/* 23000001 */]System.Decimal/* 01000002 */ 
              CalculatePower(valuetype [mscorlib/* 23000001 */]
                System.Decimal/* 01000002 */ baseNumber,
                int32 exponent)}
  10. private 访问器更改为 public
  11. 确保命令提示符的工作目录是您用于保存 IL 文件的临时目录。
  12. 在命令提示符下,键入 ilasm /DLL SatelliteAssembly.IL <enter>。

现在,您将获得一个具有新版本号和 public 方法访问器的程序集。当您没有对源代码的显式访问权限或源代码不可用时,这会派上用场。

关注点

显然,反汇编/汇编提供的功能非常强大,并且可以通过此功能进行许多其他的调整和更改。

我没有在混淆的代码上尝试过这种方法(为了开发,我们的代码没有被混淆)。如果您已经在混淆的代码上尝试过,请告诉我效果如何。

ILASM 有许多您可能想要研究的开关(例如,/DEBUG 提供用于调试信息的.PDB 文件)。

© . All rights reserved.