修改并运行现有.NET程序集而不保存到磁盘

时间:2011-01-10 09:40:10

标签: .net reflection clr

有没有办法修改现有.NET程序集中的方法,并执行程序集而不将其保存到磁盘。我希望功能类似于System.Reflection.Emit.MethodRental,但Reflection.Emit命名空间仅处理动态创建的程序集。有许多方法涉及创建新的可执行文件。或修改现有的一个,但我想避免做其中任何一个。

我可以使用CLR分析器的JIT编译钩子来重写方法体,但是更喜欢可以在C#中完成的方法。用例是在功能入口/出口处输出程序值的分析器的一部分。

2 个答案:

答案 0 :(得分:2)

如果您有修改后的二进制内容,则可以使用Assembly.Load(byte[])。但是,您无法修改加载的程序集 - 您必须单独处理修改。

如果您反复执行此操作,您可能还希望在单独的AppDomain中运行此操作(如果只执行一次,则可能不需要)。

答案 1 :(得分:0)

看看.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 - 此库允许在运行时更改代码。