8

我已经使用 System.CodeDom.CodeCompileUnit 动态地构建了一些类型,想要将它们编译成内存中的 IL 代码,并将该 IL 代码注入到内存中加载的程序集中 - 无需将任何内容保存到磁盘。也许我的计划是错误的。接受有关如何将该 CodeCompileUnit 实例到达所述目的地的其他建议。

4

3 回答 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 回答