我使用System.CodeDom.CodeCompileUnit动态构建了一些类型,想要将它们编译成内存中的IL代码,并将该IL代码注入到内存中加载的程序集中 - 不需要将任何这些保存到磁盘中。也许我说的计划是错的。打开有关如何将CodeCompileUnit实例传递到所述目标的其他建议。
答案 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。它是一个强大的工具,虽然它在某种程度上缺乏文档。