我正在开发在屏幕上绘制一些信息的 .NET 应用程序。在开发过程中,使用 Visual Studio 的“编辑并继续”功能非常方便,只需对代码进行细微的更改,即可立即反映在屏幕上。问题是,屏幕重绘应该是手动触发的,我无法知道“编辑并继续”何时发生。
我的应用程序实际上是一个大型第三方系统的插件,初始化(应用程序启动)需要一些时间,所以每次小改动就停止调试并重新启动成本太高。我想以某种方式“捕捉”我正在运行的应用程序中代码更改的时刻,并触发屏幕刷新,以便进行某种“实时刷新”。
“编辑并继续”机制显然直接在内存中修补代码,因此监视磁盘上的文件更改没有任何作用。我什至到目前为止枚举了进程的内存页面以检测代码部分的变化,但是...... CLR 进程内存布局被证明非常复杂(尤其是在调试模式下),因此我找不到工作解决方案......在“本机” C++ 应用程序可以定期计算内存中代码段的校验和,但这在 .NET 应用程序中并不那么简单。在内存中查找更改的代码并不容易,因为 CLR 生成的 x86 代码分散在不同的页面上(与“普通”本机进程相反)。
我愿意尽可能集成某种 Visual Studio 互操作解决方案,使用它的 API 来监视该事件......但是我对 VS SDK 的(有限)研究无法找到能够提供的 API ...
那么......当“编辑并继续”发生时,有什么方法(甚至是“hackish”)可以在我正在运行的应用程序中检测到?当 Visual Studio 注入修改后的代码时,应该会发生一些 CLR“事件”......或者可以检测到正在运行的应用程序的内存(例如)中的一些其他更改。任何类型的低级操作(如 API 挂钩)都是可以接受的,只要它能够始终如一地工作。