Getting the CLR ID

本文关键字:ID CLR the Getting | 更新日期: 2023-09-27 18:31:36

是否有任何位置可以在运行时获取当前应用程序的 CLR ID?我正在使用性能监视器监视我的系统,用于实例的名称是:

ApplicationName.exe_p4952_r15_ad1

我可以通过编程方式获取所有其他参数,但不能获取r15,即执行代码的公共语言运行时(实例)的运行时 ID。我注意到它总是 15,但最好动态获取以避免并发症。

Getting the CLR ID

您可以使用与

.NET 框架(例如性能计数器)相同的基础结构获取整个"后缀",即Application.exe后的部分。

有方法System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName,它可以做到这一点。请注意,该方法被描述为"基础结构"和"此 API 支持 .NET Framework 基础结构,不应直接从代码中使用",但它是公开的。我认为没有任何"更好支持"的方式来获取您想要的信息。至少它对未来的变化更加健壮和弹性,然后根据文档对信息进行逆向工程。

string suffix = System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName("",                         
    System.Runtime.Versioning.ResourceScope.Machine,
    System.Runtime.Versioning.ResourceScope.AppDomain));

例如,这将返回_p4472_r16_ad1

当然,您也可以直接传递性能计数器的基名称,以直接获取全名。上面空字符串的使用只是获取"后缀"的技巧。

string str = VersioningHelper.MakeVersionSafeName("Application.exe",
    ResourceScope.Machine, ResourceScope.AppDomain);
// str -> "Application.exe_p4472_r16_ad1".

VersioningHelpers也有私有方法GetRuntimeId(),但鉴于上述情况,我认为没有必要使用反射来实现您需要的东西。

据我所知,没有办法预测该值将是多少 - 这是您链接的 MSDN 页面中的引用(强调我的)

运行时 ID 是公共语言运行时标识符。

本文有点令人困惑,因为它提供了一个示例,其中应用程序myapp.exe承载两个 CLR 运行时,但在示例中,这两个实例似乎具有不同的进程 ID 但相同的 CLR 运行时 ID。

然而,这篇文章绝对没有给出任何关于 CLR 运行时 ID 的值或如何找到它的承诺(它甚至没有说明它是一个数字),这对我来说意味着它是一个内部的东西,你不应该依赖能够弄清楚它是什么。

我的方法可能是枚举所有 Perfmon 计数器并监视与您的 PID 匹配的任何计数器。 如果有多个(如果您使用任何 .Net 2.0 组件,就会发生这种情况),那么您只需要同时监视这两个组件。

你能提供更多关于你想做什么的信息吗?

您可以通过拆分得到的字符串轻松找到它:

此函数拆分实例名称,并搜索唯一以"r"开头且不以".exe"结尾的部分。一旦找到字符串的正确部分,只需删除第一个字母"r"并保留数字以将其转换为整数并返回它。如果未找到 CLR ID,只需返回 "-1" 让父函数注意到这一点。

    int getClrID(string instance_name)
    {
        string[] instance_name_parts = instance_name.Split('_');
        string clr_id = "";
        for (int i = 0; i < instance_name_parts.Length; i++)
        {
            if (instance_name_parts[i].StartsWith("r") && !instance_name_parts[i].EndsWith(".exe"))
            {
                clr_id = instance_name_parts[i];
                break;
            }
        }
        if (clr_id == "") // An error occured ...
            return -1;
        else 
            return Convert.ToInt32(clr_id.Substring(1));
    }

我希望我能帮助你。