Внедрение кода не работает с MSCorLib в.Net 2.x

В нашем приложении.Net мы хотим отслеживать файл, который открывается через.Net Code. Любой файл, который открывается, вызов выполнения всегда проходит через внутренний метод экземпляра FileStrem.Init (...), который доступен в mscorlib.

Чтобы внедрить наш код мониторинга в любой метод.Net, мы создали инфраструктуру на C++ с использованием API-интерфейсов ICorProfiler, предоставленных Microsoft. Все, что он делает, это то, что по завершении загрузки модуля считывает существующий IL из целевого метода из загруженного модуля, создает собственный код с использованием IL и внедряет его в целевой метод.

Эта структура отлично работает. Мы можем внедрить наш код мониторинга во многие методы, включая метод FileStream.Init(...) в mscorlib для.Net 4.x. Но тот же внедренный код не вызывается в.Net 2.x.

Мы можем внедрить наш код в любую.Net DLL, кроме mscorlib для.Net 2.x. Код вводится правильно, но не вызывается. Я проверил IL FileStream.Init(...) после введения кода; Я вижу, мой код присутствует. Но, не уверен, почему это не вызывается. Однако тот же код работает с файлом FileStream.Init(...) для.Net 4.x.

Вот пример кода C++ для внедрения через IL -

// 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 для.Net 2.x?

1 ответ

Решение

Вы не можете заменить тело метода, если оно покрыто изображением ngen-ed (обычно mscorlib является ngen-ed). Вы можете использовать COR_PRF_DISABLE_ALL_NGEN_IMAGES флаг для отключения изображений ngen, но этот флаг не был введен до.NET 4 и поэтому не будет работать для.NET 2.

В.NET 2 дня общим решением было использовать COR_PRF_USE_PROFILE_IMAGES и надеюсь, что на машине не было изображений ngen, сгенерированных с поддержкой профилирования.

Другие вопросы по тегам