让我们说我有一个有错误的程序是这样的:

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,现在他们所要求的,它修复。虽然我可以重新部署与修复,其对我的控制范围之外的原因,一个极端的麻烦这个应用程序 - 我只想写的缺陷的补丁,而不是

具体来说,我想我自己的MSIL插入违规assmembly源文件。我从来没有做过这样的事之前,和谷歌搜索还没有止跌回升任何有用的信息。如果我能看到的是如何做到这一点在上面的代码示例,它会帮助我极大的:)

如何编程注入我自己的MSIL为编译.NET程序集?

[编辑补充:]对于那些谁问:我不需要运行热交换进行。它完美的罚款对我来说,有应用程序关闭,操控组件,然后再重新启动该程序。

[编辑一个更多的时间:]它看起来像一般的共识是“操纵组件是的的方式来修补程序”。我不会走这条道路,如果它是一个坏主意

我将离开开放的问题,因为MSIL注入仍可能用于其他目的:)

有帮助吗?

解决方案

我想我会问的问题是“你会如何部署补丁”?冥冥之中,你要部署的东西来修复错误,已经是在野外。为什么会重新编译DLL和释放固定的版本确实是一个问题?我的猜测是,搞清楚如何以编程方式注入MSIL将是比简单地重新部署一个固定的装配更加麻烦。

其他提示

,而不是在运行时注入MSIL,你认为直接将所述源到组件?

您可以用ILDASM拆卸,插入您的MSIL,然后用ILASM重新组装,然后部署的该产品。

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

二进制DIFF http://www.daemonology.net/bsdiff/

如果您的exe文件的签署,那么这将是不可能的。为什么你就不能释放单一组装,而不是再次发货整个应用程序?这似乎是你的目标为一个简单的问题复杂的解决方案。

您可以使用静态MSIL注入。单丝丝或PostSharp也许有益的。

的信息很好来源...

IL编程电子书

另一个是MS按IL编程的书。

步骤来编译到IL编译和

1。 ILDASM /output=ConsoleApplication1.il ConsoleApplication1.exe中

2。 //修改ConsoleApplication1.il代码

3。 ILASM ConsoleApplication1.il

您将需要非托管代码成功地执行这一点,但它可以做到......

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top