在我们的 .Net 应用程序中,我们想要跟踪通过 .Net 代码打开的文件。任何打开的文件,执行调用总是通过一个内部实例方法 FileStrem.Init(...) ,它在 mscorlib 中可用。
为了将我们的监控代码注入到任何 .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)
知道为什么它在 .Net 2.x 的 mscorlib 中不起作用吗?