Вопрос

Допустим, у меня есть глючащее приложение, подобное этому:

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 в исходный файл assmembly, вызывающий нарушение.Я никогда раньше не делал ничего подобного, и поиск в Google не дал никакой полезной информации.Если бы я мог просто увидеть пример того, как это сделать в приведенном выше коде, это бы мне очень помогло :)

Как мне программно внедрить свой собственный MSIL в скомпилированную сборку .NET?

[Отредактируйте, чтобы добавить:] Для тех, кто спрашивал:Мне не нужна горячая замена во время выполнения.Для меня совершенно нормально закрыть приложение, манипулировать сборкой, а затем снова перезапустить программу.

[Отредактируйте еще раз:] Похоже, что общий консенсус заключается в том, что "манипулирование ассамблеей - это плохой способ исправления программы".Я не пойду по этому пути, если это плохая идея.

Я оставлю вопрос открытым, потому что внедрение MSIL все еще может быть полезно для других целей :)

Это было полезно?

Решение

Я предполагаю, что вопрос, который я бы задал, звучит так: "как бы вы развернули патч"?Где-то вы должны что-то внедрить, чтобы исправить ошибку, которая уже широко распространена.Почему перекомпиляция библиотеки dll и выпуск исправленной версии действительно могут быть проблемой?Я предполагаю, что выяснить, как программно внедрить MSIL, будет сложнее, чем просто повторно развернуть фиксированную сборку.

Другие советы

Вместо того чтобы внедрять MSIL во время выполнения, рассматривали ли вы возможность вставки исходного кода непосредственно в сборку?

Вы можете разобрать с помощью ildasm, вставить свой MSIL, а затем снова собрать с помощью ilasm, после чего развернуть этот продукт.

Если причина, по которой вы не хотите повторно развертывать весь материал, заключается в том, что на самом деле это половина концерта, вам, вероятно, следует использовать какой-нибудь инструмент бинарного исправления - это первый результат в Google:

Двоичная разница http://www.daemonology.net/bsdiff/

Если ваш exe-файл подписан, то это было бы невозможно.Почему вы не можете просто выпустить эту единственную сборку, вместо того чтобы снова отправлять все приложение целиком?Похоже, вы стремитесь к комплексному решению простой проблемы.

Вы можете использовать статическую инъекцию MSIL.Моно Сесил или PostSharp могут быть полезны.

хороший источник информации...

Электронная книга по программированию IL

другая - книга MS Press по программированию на IL.

шаги по декомпиляции в IL и перекомпиляции

1.ильдасм /output=ConsoleApplication1.il ConsoleApplication1.exe

2.//изменить ConsoleApplication1.il код

3.иласм ConsoleApplication1.il

Для успешного выполнения этого вам понадобится неуправляемый код, но это можно сделать...

Видишь http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top