CorProfiler: как получить контекстные данные .Net в обратном вызове ClassLoadFinished в переполнении стека

Для некоторых пользовательских требований мы хотим записать каждый загруженный класс в .Net. Для этого мы внедрили .Net profiler в C ++, используя API-интерфейсы CorProfiler. Здесь мы подписываемся на события COR_PRF_MONITOR_CLASS_LOADS и реализуем обратный вызов ClassLoadFinished. Все отлично работает Мы можем найти имя класса вместе с соответствующей сборкой и модулями. Все идет нормально.

В дополнение к этому мы храним некоторую контекстную информацию (например, идентификатор пользователя) в .Net. Мы также хотим получить такую ​​контекстную информацию. Например, под чьим контекстом загружен класс?

Проблема в том, что контекстная информация доступна в управляемом C #, а событие загрузки класса доступно в неуправляемом C ++ (через обратный вызов cor profiler). Я подумал о следующих опциях, чтобы получить контекстную информацию в C ++:

  1. Сохраните контекстную информацию в CallContext.LogicalSetData в C #. Создайте отдельную управляемую C ++ DLL с помощью / clr, называемого ManagedCpp. Прочитайте контекстную информацию, используя System :: Runtime :: Remoting :: Messaging :: CallContext :: LogicalGetData («UserID»). Добавьте ссылку на проект ManagedCpp в неуправляемый проект профилировщика C ++. И, наконец, вызов метода выше в ManagedCPP из обратного вызова ClassLoadFinished, чтобы получить контекстную информацию.

  2. Вызов C # из C ++ с использованием COM

Но в соответствии с рекомендациями Microsoft, .Net profiler должен быть чистой неуправляемой библиотекой C ++. Не должно быть связи COM или ссылки на управляемый код.

Итак, как мне получить контекстную информацию C # в C ++?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …