有什么方法可以修改现有.NET程序集中的方法,并执行程序集而不将其保存到磁盘。我想要的功能与System.Reflection.Emit.MethodRental
类似,但Reflection.Emit
命名空间只处理动态创建的程序集。有许多方法涉及到创建一个新的可执行文件。或修改现有的,但我想避免做这些。修改并运行现有.NET程序集而不保存到磁盘
我可以使用CLR分析器的JIT编译钩子来重写方法体,但是更喜欢可以在C#中完成的方法。用例是作为在函数入口/出口处输出程序值的分析器的一部分。
有什么方法可以修改现有.NET程序集中的方法,并执行程序集而不将其保存到磁盘。我想要的功能与System.Reflection.Emit.MethodRental
类似,但Reflection.Emit
命名空间只处理动态创建的程序集。有许多方法涉及到创建一个新的可执行文件。或修改现有的,但我想避免做这些。修改并运行现有.NET程序集而不保存到磁盘
我可以使用CLR分析器的JIT编译钩子来重写方法体,但是更喜欢可以在C#中完成的方法。用例是作为在函数入口/出口处输出程序值的分析器的一部分。
如果您有修改的二进制内容,您可以使用Assembly.Load(byte[])
。但是,您不能修改装配的零件 - 您必须单独处理修改。
如果您正在重复执行此操作(如果只执行一次,您可能不需要),您可能还需要考虑在单独的AppDomain
中运行此操作。
看看“表达式树”自带.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能 - 这个库可以在运行时更改代码。
CLR Profiler API将是最小的努力,但这仍然是一个很大的努力。 – leppie 2011-01-10 09:46:52