Instrumentation Profiler в CoreCLR - способы загрузки HelperAssembly для выполнения процесса tnet - PullRequest
1 голос
/ 04 февраля 2020

Я пытаюсь использовать прибор. NET Базовые веб-приложения, работающие на. NET Core 3.1 с использованием CoreCLR Profiler в linux centos7. Я установил значения среды CORECLR_PROFILER, CORECLR_ENABLE_PROFILING и CORECLR_PROFILER_PATH, где моя библиотека CoreCLRProfiler привязана к do tnet .exe и получает обратные вызовы.

Я могу получить все обратные вызовы, но разрешить вставку кода в метод Webapplication, после чего происходит сбой приложения (do tnet .exe убивается), так как он не может найти вызов встроенной функции.

Я создал вспомогательную сборку (. NET стандарт 2.0) с введенным телом функций, подписав его строгим именем и установив в GA C. А также использовал DefineAssemblyRef (), DefineTypeRefByName () и DefineMemberRef () из IMetaDataAssemblyEmit для загрузки сборки и ее методов класса. А также попробовал, поместив do tnet standard dll в папку приложения. Но вспомогательная сборка не загружена для выполнения процесса tnet .exe.

Где должна находиться моя вспомогательная сборка? и

как я могу загрузить вспомогательную сборку для выполнения tnet процесса из моего собственного профилировщика coreclr?

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

Заранее спасибо.

1 Ответ

1 голос
/ 11 февраля 2020

Я много играл с загрузкой управляемой DLL и вызовом ее из нашего Profiler: много разных подходов, почти все они имели ограничение, так или иначе. Проблема, с которой мы столкнулись, заключалась в том, что если метод, который вызывает внешнюю DLL, уже скомпилирован, загружать внешнюю DLL уже слишком поздно. Даже если метод скомпилирован и dll загружен как часть метода (до вызова dll), это все еще слишком поздно для CLR. То, что вы можете сделать, немного нестабильно, но оно работает: назначьте вызов https://docs.microsoft.com/en-us/dotnet/api/system.appdomain.assemblyresolve и добавьте свой собственный метод, который ищет в указанном c месте. Это должно быть сделано как можно раньше (до компиляции метода, вызывающего эту сборку). Обратите внимание, что это будет поддерживать. Net Framework, а также. Net Core. Если вам нужна только поддержка. Net Core, вы можете воспользоваться способом, описанным здесь: https://github.com/richlander/dotnet-core-assembly-loading

...