Я работаю над профилировщиком MSIL и столкнулся с проблемами с ManagedToUnmanagedTransition
и UnmanagedToManagedTransition
обратными вызовами интерфейса ICorProfilerCallback
.
То, что я хочу получить, - это информация о вызываемом методе (имя и имя модуля, в котором он находится).
До сих пор он работал нормально. Пока не произошло так называемое динамическое pinvoke (подробно описано в: http://blogs.msdn.com/b/jonathanswift/archive/2006/10/03/dynamically-calling-an-unmanaged-dll-from-.net-_2800_c_23002900_.aspx)
В этом случае IMetaDataImport::GetPinvokeMap
завершается сбой. Также IMetaDataAssemblyImport::GetAssemblyProps
возвращает "dynamic_pinvoke" как имя сборки.
profiler_1_0->GetTokenAndMetaDataFromFunction(function_id, IID_IMetaDataImport, (IUnknown**) &imd_import, &md_token);
imd_import->GetPinvokeMap(md_token, &mapping, module_name, buffer_size, &chars_read, &md_module_ref);
// here the fail occurs
profiler_1_0->GetTokenAndMetaDataFromFunction(function_id, IID_IMetaDataAssemblyImport, (IUnknown**) &imd_assembly_import, &md_token);
imd_assembly_import->GetAssemblyFromScope(&md_assembly);
imd_assembly_import->GetAssemblyProps(md_assembly, 0, 0, 0, assembly_name, buffer_size, &chars_read, 0, 0);
// assembly_name is set to "dynamic_pinvoke"
Как получить имя модуля (.dll) и имя функции, которая выведена с помощью динамического pinvoke?