如何发出代码并将其注入加载的程序集?

时间:2009-11-15 02:59:48

标签: c# .net reflection.emit

我使用System.CodeDom.CodeCompileUnit动态构建了一些类型,想要将它们编译成内存中的IL代码,并将该IL代码注入到内存中加载的程序集中 - 不需要将任何这些保存到磁盘中。也许我说的计划是错的。打开有关如何将CodeCompileUnit实例传递到所述目标的其他建议。

3 个答案:

答案 0 :(得分:7)

您可以使用ICorDebug接口将代码注入现有(已加载)程序集。编辑并继续执行。

计算delta字节并调用ICorDebugModule2::ApplyChanges。有关详细信息,请参阅MDbg sample code

曾几何时我们使用过ICorDebugModule::GetEditAndContinueSnapshot和亲属,但现在已经弃用了这些内容。

更新如果您不关心将代码注入已加载的程序集中,只需使用Reflection.Emit创建新程序集就会更高效,也更容易。

答案 1 :(得分:1)

您还可以使用System.Reflection.Emit命名空间并创建动态的内存中程序集。

替代方案是使用CodeDom生成&编译代码,然后调用它。

XMLSerialization()执行后者。

答案 2 :(得分:1)

您可以使用Mono.Cecil来操纵IL。它是一个强大的工具,虽然它在某种程度上缺乏文档。