7

假设我有一个这样的错误应用程序:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("2 + 1 = {0}", Add(2, 1));
        }

        static int Add(int x, int y)
        {
            return x + x; // <-- oops!
        }
    }
}

该应用程序已经编译并部署到野外。有人发现了这个错误,现在他们正在请求修复它。虽然我可以使用修复程序重新部署此应用程序,但由于我无法控制的原因,这非常麻烦——我只想为该错误编写一个补丁程序。

具体来说,我想将我自己的 MSIL 插入到有问题的汇编源文件中。我以前从来没有做过这样的事情,谷歌搜索也没有找到任何有用的信息。如果我可以在上面的代码中看到如何执行此操作的示例,它将极大地帮助我:)

如何以编程方式将自己的 MSIL 注入已编译的 .NET 程序集?

[编辑添加:] 对于那些问的人:我不需要运行时热交换。关闭应用程序,操作程序集,然后再次重新启动程序对我来说非常好。

[再编辑一次:] 看起来普遍的共识是“操纵程序集是修补程序的方法”。如果这是一个坏主意,我不会走那条路。

我会留下这个问题,因为 MSIL 注入可能仍然对其他目的有用:)

4

7 回答 7

5

我想我会问的问题是“你将如何部署补丁”?在某个地方,您必须部署一些东西来修复已经存在的错误。为什么重新编译 dll 并发布固定版本真的是个问题?我的猜测是,弄清楚如何以编程方式注入 MSIL 将比简单地重新部署固定程序集更麻烦。

于 2009-02-04T18:43:44.007 回答
4

您是否考虑过将源代码直接插入到程序集中,而不是在运行时注入 MSIL?

您可以使用 ildasm 进行拆卸,插入您的 MSIL,然后使用 ilasm 重新组装,然后部署其产品。

于 2009-02-04T18:40:39.803 回答
3

如果你不想重新部署整个东西的原因是因为它真的是半场演出,你可能应该使用某种二进制补丁工具——这是谷歌的第一个结果:

二进制差异 http://www.daemonology.net/bsdiff/

于 2009-02-04T18:50:20.000 回答
2

很好的信息来源...

IL 编程电子书

另一个是关于 IL 编程的 MS Press 书籍。

反编译为 IL 并重新编译的步骤

1. ildasm /output=ConsoleApplication1.il ConsoleApplication1.exe

2. //修改ConsoleApplication1.il代码

3. ilasm ConsoleApplication1.il

于 2009-06-09T22:39:46.867 回答
1

如果您的 exe 已签名,那么这是不可能的。为什么不能只发布单个程序集,而不是再次发布整个应用程序?看起来您的目标是为一个简单的问题提供一个复杂的解决方案。

于 2009-02-04T18:56:38.897 回答
1

您可以使用静态 MSIL 注入。Mono Cecil 或 PostSharp 可能会有所帮助。

于 2009-02-04T19:14:48.000 回答
1

您将需要非托管代码才能成功执行此操作,但可以完成...

请参阅http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time

于 2012-12-13T03:21:52.927 回答