好吧,我有一个应用程序,我的任务是编辑该源不可用,并且由于保密性,我无法共享该应用程序/代码 - 我意识到这使得这类问题具有挑战性,但因为我之前已经这样做过相信这是我忽略的简单事情。
我过去曾执行过此操作,唯一的区别是这是使用 4.5 和最新的 C# 编译器等构建的新版本。
场景如下:
我可以打开应用程序,正确读取它并编辑 IL。事实上,我可以在 Reflection 桌面(最新)、Telerik(我通常使用的)中使用 reflexil 毫无问题地编辑它,也使用更新的 reflexil,然后我还尝试了 dnSpy latest nightly 3.0.1。
哎呀,以为我疯了我什至使用旧的GreyDragon打开它,还编辑了一些IL,保存了exe程序集,甚至直接在入口点main中的IL仍然没有按更改执行,而是像之前未更改的原始文件一样执行,但在所有这些工具中,如果我重新打开以前编辑和保存的程序集 exe,它在所有情况下都会正确显示更改,包括反编译的 C# 和相应的 IL 指令。
我唯一可以指出的可能再次不同的是较新的目标 dotnet 版本,它是在较新的 C# 编译器/版本中编译的。
那么,是否有任何原因导致最新版本的 C# Rosylyn 等会阻止以前工作的 IL 编辑方法(以及几乎所有可以进行 IL 编辑的工具)现在工作,几乎就像一个二级指令备份表等. 拥有将要执行的未经编辑的原始副本?
或者,程序集重新生成的特定“设置”是否会导致此行为?
在我开始尝试描述更精细的细节之前,让我们先了解一下我可能遗漏的一些基本障碍。
再次抱歉没有实际的代码可以分享,但希望真正的大师会知道发生了什么并有想法。谢谢!
最佳答案
发布我自己的答案不敢相信我错过了这个。
答案是即使它没有作为程序集安装在 GAC 中,这个应用程序的行为发生了变化,我错过了一个进程以某种方式运行 NGEN.EXE 以将 NI native 镜像编译为 native 镜像并安装它 -然后包含有问题的 friggin 机器代码的缓存版本 - 正是我的直觉所说正在发生的事情我只需要找到那个“备份副本”。
关于c# - 在没有源代码的情况下编辑 C# 程序集的 IL 不反射(reflect)执行时的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42543297/