代码之家  ›  专栏  ›  技术社区  ›  Juliet

程序化MSIL注入

  •  7
  • Juliet  · 技术社区  · 17 年前

    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!
            }
        }
    }
    

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

    具体来说,我想将我自己的MSIL插入有问题的assmembly源文件。我以前从未做过类似的事情,谷歌也没有找到任何有用的信息。如果我能在上面的代码中看到一个如何做到这一点的示例,它将极大地帮助我:)

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

    [再编辑一次:]看起来普遍的共识是“操纵大会是一个错误” 我不会走那条路,如果它是一个 bad idea .

    我将保留这个问题,因为MSIL注入在其他方面可能仍然有用:)

    7 回复  |  直到 17 年前
        1
  •  5
  •   David Morton    17 年前

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

        2
  •  4
  •   TheSmurf    17 年前

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

    您可以使用ildasm进行反汇编,插入MSIL,然后使用ilasm重新组装,然后部署该产品。

        3
  •  3
  •   Tamas Czinege    17 年前

    如果你不想重新部署整个东西的原因是因为它实际上只有半个gig,那么你可能应该使用某种二进制补丁工具——这是谷歌的第一个结果:

    Binary Diff http://www.daemonology.net/bsdiff/

        4
  •  2
  •   anonymousType anonymousType    17 年前

    好的信息来源。。。

    IL Programming ebook

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

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

    2.

    3.

        5
  •  1
  •   Apocalisp    17 年前

        6
  •  1
  •   tobsen    17 年前

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

        7
  •  1
  •   Jay    13 年前

    您将需要非托管代码才能成功执行此操作,但这是可以做到的。。。

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

    推荐文章