我已经使用 System.CodeDom.CodeCompileUnit 动态地构建了一些类型,想要将它们编译成内存中的 IL 代码,并将该 IL 代码注入到内存中加载的程序集中 - 无需将任何内容保存到磁盘。也许我的计划是错误的。接受有关如何将该 CodeCompileUnit 实例到达所述目的地的其他建议。
问问题
1550 次
3 回答
7
您可以使用接口将代码注入现有(已加载)程序集ICorDebug
。编辑并继续这样做。
计算您的增量字节并调用ICorDebugModule2::ApplyChanges
. 有关更多详细信息,请参阅MDbg 示例代码。
曾几何时,我们使用ICorDebugModule::GetEditAndContinueSnapshot
和 kin,但现在已弃用。
更新如果您不关心将代码注入到已加载的程序集中,那么仅使用Reflection.Emit
创建新程序集会更高效且容易得多。
于 2009-11-15T04:01:24.213 回答
1
您还可以使用 System.Reflection.Emit 命名空间并创建动态的内存程序集。
另一种方法是使用 CodeDom 生成和编译代码,然后调用它。
XMLSerialization() 执行后者。
于 2009-11-15T04:05:41.627 回答
1
您可以使用Mono.Cecil来操作 IL。这是一个强大的工具,尽管它缺少文档。
于 2009-11-15T07:22:34.823 回答