首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取CLR ID

获取CLR ID
EN

Stack Overflow用户
提问于 2012-04-18 01:57:12
回答 3查看 1.1K关注 0票数 9

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

代码语言:javascript
复制
ApplicationName.exe_p4952_r15_ad1

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-26 15:49:00

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

有一个方法System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName,它可以做到这一点。请注意,该方法被描述为“基础结构”和“此应用程序接口支持.NET框架基础结构,并且不打算直接在您的代码中使用”,但它仍然是公共的。我不认为有任何“更好的支持”的方式来获得你想要的信息。至少它更健壮,对未来的变化更有弹性,然后基于文档对信息进行逆向工程。

代码语言:javascript
复制
string suffix = System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName("",                         
    System.Runtime.Versioning.ResourceScope.Machine,
    System.Runtime.Versioning.ResourceScope.AppDomain));

例如,这将返回_p4472_r16_ad1

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

代码语言:javascript
复制
string str = VersioningHelper.MakeVersionSafeName("Application.exe",
    ResourceScope.Machine, ResourceScope.AppDomain);

// str -> "Application.exe_p4472_r16_ad1".

VersioningHelpers也有私有方法GetRuntimeId(),但考虑到上面的情况,我认为没有必要使用反射来实现您所需要的。

票数 5
EN

Stack Overflow用户

发布于 2012-04-26 00:16:15

据我所知,没有办法预测这个值是多少-这里引用了MSDN page you linked的一句话(强调我的)

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

本文有点混乱,因为它给出了一个示例,其中一个应用程序myapp.exe托管两个CLR运行时,然而在示例中,这两个实例似乎具有不同的进程ID,但具有相同的CLR运行时ID。

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

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

你能提供更多关于你正在尝试做的事情的信息吗?

票数 1
EN

Stack Overflow用户

发布于 2012-04-25 23:17:19

通过拆分得到的字符串,你可以很容易地找到它:

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

代码语言:javascript
复制
    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));
    }

我希望我能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10196432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档