9

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

ApplicationName.exe_p4952_r15_ad1

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

4

3 回答 3

5

您可以获得整个“后缀”,即Application.exe使用与 .NET 框架(例如性能计数器)相同的基础架构后的部分。

有方法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例如,这将返回。

当然,也可以直接传递性能计数器的basename,直接得到全名。上面空字符串的使用只是获取“后缀”的一个技巧。

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

// str -> "Application.exe_p4472_r16_ad1".

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

于 2012-04-26T07:49:00.033 回答
1

据我所知,无法预测该值将是什么 - 这是您链接的 MSDN 页面的引用(强调我的)

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

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

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

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

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

于 2012-04-25T16:16:14.850 回答
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));
    }

我希望我对你有所帮助。

于 2012-04-25T15:17:19.030 回答