在没有源代码的情况下编辑 C# 程序集的 IL 不反映执行时的更改

Editing IL of C# assembly without source not reflecting changes upon execution

好吧,我有一个应用程序,我的任务是编辑该源不可用,并且由于机密性,我不能分享 app/code - 我意识到这使得这类问题具有挑战性,但因为我有在我认为这是我忽略的简单事情之前完成了此操作。

我过去曾执行过此操作,唯一的区别是这是使用 4.5 和最新的 C# 编译器等构建的新版本。

场景如下:

我可以打开应用程序,正确阅读并编辑 IL。事实上,我可以在 Reflection 桌面(最新)、Telerik(我通常使用的)中使用 reflexil 毫无问题地编辑它,也使用更新的 reflexil,然后我还尝试了 dnSpy latest nightly 3.0.1。

哎呀,以为我疯了我什至用旧的GreyDragon打开它,还编辑了一些IL,保存了exe程序集,甚至直接在入口点main中的IL仍然没有像改变的那样执行,而是像之前那样执行原始未更改,但在所有这些工具中,如果我重新打开以前编辑和保存的程序集 exe,它在所有情况下都会正确显示更改,无论是在反编译的 C# 中还是在相应的 IL 指令中。

我唯一能确定的可能再次不同的是更新的目标 dotnet 版本,它是在更新的 C# 中编译的 compiler/ver。

那么,是否有任何理由表明最新版本的 C# Rosylyn 等会阻止以前工作的 IL 编辑方法(以及几乎所有可以进行 IL 编辑的工具)现在工作,几乎就像辅助指令备份一样table 等持有将要执行的未经编辑的原始副本?

或者,特定的 "setting" 程序集重新生成是否会导致此行为?

在我开始尝试描述更详细的细节之前,让我们先了解一下我可能遗漏的一些基本障碍。

再次抱歉没有实际的代码可以分享,但希望真正的专家知道发生了什么并有想法。谢谢!

发布我自己的答案不敢相信我错过了这个。

答案是即使它没有作为程序集安装在 GAC 中,这个应用程序的行为也发生了变化,我不知何故错过了一个过程 运行 NGEN.EXE 针对它编译 NI 本机映像到一个 NATIVE IMAGE 并安装它 - 然后包含有问题的 friggin 机器代码的缓存版本 - 正是我的直觉所说正在发生的事情我只需要找到 "backup copy".