ILASM.exe 进程在构建过程中卡住

ILASM.exe process gets stuck during build

我在 Visual Studio 2015 年构建了一个 WPF 库,但构建从未完成。在构建输出诊断级别中,我可以看到 msbuild 启动的最后一个任务是

calling 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\ILAsm.exe' with /nologo "/out:[PathtoOutputDLL]" "[PathtoILfile]" /DLL "/resource=[PathtoResfile]"  /debug   (TaskId:65)

我可以看到 ilasm 进程挂起,没有崩溃,但没有任何反应。如果我通过终止 msbuild 并在控制台中启动相同的命令来强行停止构建,它可以快速运行,输出 Operation completed successfully

我使用 Process Monitor 来处理正在发生的事情,我发现了一些奇怪的东西,当 ilasm 成功时(运行 来自控制台),该进程被命名为 ilasm.exe当它失败时它被命名为 ILAsm.exe (注意大小写变化),我不明白为什么,特别是 exe 的路径是相同的? Process 事件日志中有一些内容提到二进制文件的预取为 运行:

成功: "IRP_MJ_READ","C:\Windows\Prefetch\ILASM.EXE-FD82B157.pf","SUCCESS","Offset: 0, Length: 82 642, Priority: Normal"

失败: "IRP_MJ_READ","C:\Windows\Prefetch\ILASM.EXE-FD82B157.pf","SUCCESS","Offset: 0, Length: 82 844, Priority: Normal"

相同的文件,但突然大小不同?

我仍然不知道它为什么会卡住,但我已将其缩小到第三方 COM 互操作与 Robert Giesecke 的 UnmanagedExports 之间的不良关系。

那个特定的 class 库依赖于第三方 COM 互操作,并且它在 UnmanagedExports 修改的 IL 中的存在以某种我不知道的方式触发了 ILASM 或 UnmanagedExports。 但是解锁构建的一件事是将 "Embed Interop types" 设置为 false,这样 COM 互操作就不会出现在输出中,然后 UnmanagedExports 可以正常工作。