2009-02-04 3 views
7

Скажем, у меня есть приложение глючит вроде этого:Programmatic MSIL инъекции

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

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

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

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

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

+0

вы хотите сделать это в то время как приложение работает или когда его в автономном режиме? – Peter

+0

В случае, если вам интересно, почему я просто не буду повторно развертывать свое приложение, программное обеспечение, которое я пишу, состоит из половины концерта exes и dll, и его выпускают только один или два раза в год. Развертывание приложения - большой процесс. Патчи и исправления позволят нам более часто нейтрализовать ошибки между развертываниями. – Juliet

+0

Половина концерта? Вау, это много! –

ответ

5

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

+0

Вот как мы сейчас это делаем, и это огромный PITA. Некоторые клиенты используют старые версии программы, некоторые из DLL подписываются, некоторые из них очень большие, и все они связаны друг с другом по версии. Я сталкиваюсь с множеством кирпичей, больше, чем я могу объяснить в этом комментарии, путем замены DLL. – Juliet

+0

Если обмен файлами DLL затруднен, как вы ожидаете ввести в них код? –

+0

Я все еще не понимаю, почему исправление ошибки в исходном коде и перекомпиляция только этой сборки были бы проблемой? Само собой разумеется, что вы не должны нарушать интерфейсы и оставлять номер версии неоскверненной. –

4

, а не инъекционным MSIL во время выполнения, Вы рассмотрели вставив источник непосредственно в сборке?

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

+1

Это те решения, которые люди люблю поддерживать. – erikkallen

+0

-1: Это невозможно будет поддерживать. –

+3

И вводить MSIL в запущенный процесс как-то проще? – TheSmurf

3

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

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

2

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

1

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

1

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

IL Programming ebook

другой является MS Press книги по программированию IL.

шаги декомпилировать к IL и перекомпилировать

1. ILDASM/выход = ConsoleApplication1.иль ConsoleApplication1.exe

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

3. ILASM ConsoleApplication1.il