2013-12-15 1 views
1

Довольно многое, о чем говорится. У меня есть .net exe, который запускается, а затем загружает мою библиотеку (в C++). Есть ли способ получить ICLRMetaHost или аналогичный интерфейс, который mscoree загружает, когда он запускает .net exe? Я хочу сделать это в первую очередь, поэтому я могу получить доступ к настройкам gc и памяти из моей родной библиотеки для целей отладки.Есть ли способ получить ICLRMetaHost из библиотеки C++

Бонусные баллы указывают на аналогичную реализацию, используя моно-хостинг api.

+0

Вы не можете возиться с настройками «Gc и памяти, связанные с» от хостинг API. Здесь недостаточно, чтобы угадать, что вы на самом деле пытаетесь сделать. Книги об этом написаны, Стивен Прашнер довольно хорош. –

+0

IGCHost :: GetThreadStats или ICLRGCManager :: GetStats похоже на функцию, которая была бы полезна. Я хочу получить доступ к памяти, которую использует CLR, поэтому я могу отображать отладочный вывод о том, сколько памяти использует каждая часть моего приложения. Возможность получить количество коллекций тоже будет хороша, обе эти функции предоставляются двумя функциями, о которых я упоминал ранее. – Programmdude

+1

. NET PerformanceCounters также возвращают эту информацию. Очень проста в использовании и не нуждается в пользовательском хостинге. Если вы не задумываетесь и не документируете то, что вам действительно нужно, то пользовательский хостинг - это просто молот, который может нанести любой гвоздь. –

ответ

1

Я не понимаю, почему нормальный способ получения ICLRMetaHost не будет работать изнутри DLL, который был загружен в CLR ...

  1. LoadLibrary на mscoree.dll
  2. Найти адрес от CLRCreateInstance.
  3. позвонить CLRCreateInstance как показано here , чтобы получить ICLRMetaHost.
  4. позвоните по номеру EnumerateLoadedRuntimes и надейтесь, что есть только один загруженный ...
  5. из вашей указанной информации о времени выполнения ICLRRuntimeHost.
  6. из ICLRRuntimeHost получить ICLRControl
  7. из ICLRControl получить ICLRGCManager
+0

#include ? –