首页 > 解决方案 > 我们可以在 CLR 分析中使用 IMetaDataImport2 从类中调用方法吗?

问题描述

我正在使用 CLR 分析 API 来分析我的 .NET Core 应用程序。

在方法中输入钩子我可以得到classID和元数据。有没有办法使用元数据从该类调用另一个函数?

例如:考虑下面的例子。在 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";
        }
    }

标签: clr-profiling-api

解决方案


通常,不建议(并且不可能通过 Profiler API)从分析器调用托管代码。这样做的方法是执行 IL 重写。

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

尽管从设计角度来看这是可能的,但分析 API 不支持托管组件。CLR 探查器必须完全不受管理。尝试在 CLR 探查器中组合托管和非托管代码可能会导致访问冲突、程序失败或死锁。探查器的托管组件将触发事件返回到它们的非托管组件,这些组件随后会再次调用托管组件,从而产生循环引用。

CLR 探查器可以安全调用托管代码的唯一位置是方法的 Microsoft 中间语言 (MSIL) 主体。修改 MSIL 主体的推荐做法是使用 ICorProfilerCallback4 接口中的 JIT 重新编译方法。

开始 IL 重写的一个好地方是http://www.debugthings.com/2015/09/16/rewriting-il-remotely-part1/。在 David 的 Broman 博客中有很多很好的信息,这里:https ://github.com/dotnet/coreclr/tree/master/Documentation/Profiling/davbr-blog-archive


推荐阅读