COMDynamicWrite.SavePEFile在哪里实施?

Where is COMDynamicWrite.SavePEFile implemented?

我正在调试将动态程序集保存到磁盘的问题,我想看看将程序集 PE 文件保存到磁盘时会抛出哪些异常。保存代码最终调用到 AssemblyBuilder.Save which eventually calls the internal method ModuleBuilder.SavePEFile. This method is an internal QCall and the target method is declared in a class called COMDynamicWrite。但是,整个存储库似乎没有此方法的实现。

COMDynamicWrite::SavePEFile 在哪里以及如何实施?

让我们来回答这个问题,任何查看 CoreCLR 项目的人都应该知道一个相关的细节。我 90% 确定 .NETCore 和完整版的 CLR 是从相同的代码库构建的。 #ifndef FEATURE_CORECLR 禁用了不应成为核心版本的内容。例如,你会发现 AppDomain 支持回来了,这是一个不在 .NETCore 中的功能,也不计划在那里。

他们在 2017 年 2 月 10 日迈出了一大步,永久脱离了 CoreCLR 代码库的根源。他们积极删除了在 FEATURE_CORECLR 无效时始终禁用的代码。可能是为了使移植工作更易于管理,我想他们为这段代码打了很多补丁。

那也删除了 COMDynamicWrite::SavePEFile()。一个典型的移植问题,因为 Unix 不使用 PE32 可执行文件格式。它仍然存在于 the previous version

我通常建议使用第一个签入版本的 CoreCLR 进行此类探索。它的补丁数量最少,因此最有可能准确地表示桌面 CLR 行为。同样,请注意拆分后对 CLR 的更改。当然很难看到。虽然它主要处于维护模式,但我确实知道,例如,他们对 GC 进行了修补,使其能够更好地处理数 GB 的巨型堆大小。只是因为它在 4.6 中引起了一个讨厌的错误,在 4.6.1 中修复