Изменить и запустить существующую сборку .NET без сохранения на диск - PullRequest
3 голосов
/ 10 января 2011

Есть ли способ изменить методы в существующей сборке .NET и выполнить сборку, не сохраняя ее на диск.Мне бы хотелось, чтобы функциональность была похожа на System.Reflection.Emit.MethodRental, но пространство имен Reflection.Emit работает только с динамически создаваемыми сборками.Есть много подходов, которые включают создание нового исполняемого файла.или изменение существующего, но я хотел бы избежать выполнения любого из этих.

Я мог бы использовать JIT-компиляторы JR-профиля CLR, чтобы также переписать тела методов, но предпочел бы подход, который мог бы быть сделан вC #.Вариант использования является частью профилировщика, который выводит программные значения при входе / выходе функции.

Ответы [ 2 ]

2 голосов
/ 10 января 2011

Если у вас есть измененное двоичное содержимое, вы можете использовать Assembly.Load(byte[]). Однако вы не можете изменить загруженную сборку - вам придется обрабатывать изменения отдельно.

Возможно, вы захотите посмотреть на выполнение этого в отдельном AppDomain, если вы делаете это повторно (если вы делаете это только один раз, вам, вероятно, не нужно).

0 голосов
/ 10 января 2011

Взгляните на «Деревья выражений», которые поставляются с .net 3, они также позволяют создавать динамические методы http://blogs.msdn.com/b/csharpfaq/archive/2009/09/14/generating-dynamic-methods-with-expression-trees-in-visual-studio-2010.aspx

Также взгляните на Mono.Cecil - эта библиотека позволяет изменять кодво время выполнения.

...