代码注入不适用于.Net 2.x中的MSCorLib



在我们的.Net应用程序中,我们希望跟踪通过.Net代码打开的文件。任何打开的文件,执行调用总是通过mscorlib中可用的内部实例方法FileStrem.Init(…(。

为了将我们的监控代码注入任何.Net方法,我们使用Microsoft提供的ICorProfiler API在C++中构建了一个框架。它所做的就是在模块加载完成后,从加载的模块中读取目标方法中的现有IL,使用IL构建自定义代码并将其注入目标方法。

这个框架运行良好。我们可以将监控代码注入许多方法中,包括用于.Net 4.x的mscorlib中的FileStream.Init(…(方法。但在.Net 2.x中不会调用相同的注入代码。

我们可以将我们的代码注入任何.Net DLL,除了用于.Net 2.x的mscorlib。代码被正确注入,但没有被调用。在注入代码后,我已经验证了FileStream.Init(…(的IL;我可以看到我的代码存在。但是,不确定为什么它没有被调用。然而,对于.Net 4.x.,相同的代码与FileStream.Init(…(一起工作

以下是通过IL-注入的C++代码示例

// Read existing IL
ModuleID modId = 0x2030202; // module id of mscorlib
mdToken tkMethodId = 0x2492333; // Method token for FileStream.Init(...)
LPCBYTE methodBodyIL;
pICorProfilerInfo->GetILFunctionBody(modId, tkMethodId, &methodBodyIL, NULL)
// build monitoring IL and inject it into the bytes read from FileStream.Init
InjectCode(&methodBodyIL)
// Update the injected method back to mscorlib in memory
pICorProfilerInfo->SetILFunctionBody(modId, tkMethodId, methodBodyIL)

你知道为什么它不能在mscorlib for.Net 2.x中工作吗?

如果方法的主体被ngen-ed图像覆盖,则不能替换它(mscorlib通常为ngen-ed(。您可能正在使用COR_PRF_DISABLE_ALL_NGEN_IMAGES标志来禁用ngen映像,但该标志直到.NET 4才引入,因此不适用于.NET 2。

在.NET时代,常见的解决方案是使用COR_PRF_USE_PROFILE_IMAGES,并希望机器在启用评测支持的情况下不会生成任何ngen映像。

相关内容

  • 没有找到相关文章