Можем ли мы вызвать метод из класса, используя IMetaDataImport2 в профилировании CLR?

Я использую API профилирования CLR для профилирования своего приложения .NET Core.

В методе ввода хука я могу получить идентификатор класса и метаданные. Есть ли способ вызвать другую функцию из этого класса, используя метаданные?

Например: Рассмотрим приведенный ниже пример. В классе CommonStats Когда метод входа/выхода вызывается для функции ProcessRequestInternal, мне нужно вызвать функцию GetDefaultValue и сохранить возвращаемое значение.

public class CommonStats
    {
        String test = 
        private void ProcessRequestInternal(String str)
        {
           test = str;
        }
        protected override string GetDefaultValue()
        {
            if(test.StartsWith("/")) {
                return "SUCCESS";
            }
            return "FAILURE";
        }
    }

person Zader    schedule 20.08.2019    source источник


Ответы (1)


Как правило, не рекомендуется (и невозможно через Profiler API) вызывать управляемый код из вашего профилировщика. Способ сделать это — выполнить перезапись IL.

Из https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/profiling-overview:

Хотя это возможно с точки зрения дизайна, API профилирования не поддерживает управляемые компоненты. Профилировщик CLR должен быть полностью неуправляемым. Попытки объединить управляемый и неуправляемый код в профилировщике среды CLR могут привести к нарушению прав доступа, сбою программы или взаимоблокировкам. Управляемые компоненты профилировщика отправят события обратно в свои неуправляемые компоненты, которые впоследствии снова вызовут управляемые компоненты, что приведет к циклическим ссылкам.

Единственное место, где профилировщик CLR может безопасно вызывать управляемый код, — тело метода на промежуточном языке Microsoft (MSIL). Рекомендуемая практика изменения тела MSIL — использование методов перекомпиляции JIT в интерфейсе ICorProfilerCallback4.

Хорошим местом для начала перезаписи IL является http://www.debugthings.com/2015/09/16/rewriting-il-remotely-part1/. Много полезной информации можно найти в блоге Дэвида Бромана, здесь: https://github.com/dotnet/coreclr/tree/master/Documentation/Profiling/davbr-blog-archive

person Egozy    schedule 21.08.2019