Winapi 使用IMetaDataEmit::Save(/ToMemory/ToStream)创建PE文件

Winapi 使用IMetaDataEmit::Save(/ToMemory/ToStream)创建PE文件,winapi,clr,cil,clr-profiling-api,Winapi,Clr,Cil,Clr Profiling Api,我正在编写一个本地CLR分析器,它可以进行一些重IL重写。在开发新功能时,我们有时会遇到CLR验证错误。对于小型方法,比较前后的字节非常容易,查看各种元素(方法头、签名、局部变量、代码和异常表,主要是)并查找错误。有时,这可能需要大量的方法,并且过程可能需要一段时间。我正试图将当前模块转储到一个文件中,以便轻松运行peverify.exe(和)。 我发现了IMetaDataEmit::Save,它在纸上看起来非常完美(我们经常使用IMetaDataEmit来执行IL重写)。我可以转储我的模块,在

我正在编写一个本地CLR分析器,它可以进行一些重IL重写。在开发新功能时,我们有时会遇到CLR验证错误。对于小型方法,比较前后的字节非常容易,查看各种元素(方法头、签名、局部变量、代码和异常表,主要是)并查找错误。有时,这可能需要大量的方法,并且过程可能需要一段时间。我正试图将当前模块转储到一个文件中,以便轻松运行peverify.exe(和)。
我发现了IMetaDataEmit::Save,它在纸上看起来非常完美(我们经常使用IMetaDataEmit来执行IL重写)。我可以转储我的模块,在十六进制查看器中打开它,并查看我所做的更改。但是,它只转储模块(PE中的.Net目录)。如何从该模块创建完整的PE(dll/exe),最好是通过编程方式?

我不知道有任何预构建的系统组件允许您组装PE映像(除非API中隐藏了某些内容)。项目实现了自己的功能,这一事实似乎支持了这一点。也许这可以作为在非托管或托管代码中实现您自己的代码的起点。不过,我不知道你能做多少。并且它仅是.NET Core,以防万一。@IInspectable,探查器回调不允许重新输入托管代码。(探查器回调是在进程中运行的,因此如果(例如)jit回调需要jit,或者GC回调需要分配托管内存,就会发生不好的事情。)
但是,它只转储模块(PE中的.Net目录)。
模块就是PE文件。如果有多模块程序集,则该程序集将跨越多个PE文件。使用
IMetaDataEmit::Save*
@bri:据我所知,
IMetaDataEmit::Save*
仅序列化PE映像中称为节的内容。它不会写入完整的PE映像。您仍然需要将其拼接在一起,包括DOS存根和PE头以及节头。除非我误解了。