【问题标题】:Getting the CLR ID获取 CLR ID
【发布时间】:2012-04-26 19:26:27
【问题描述】:

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

ApplicationName.exe_p4952_r15_ad1

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

【问题讨论】:

  • 使用 Process.GetProcesses 对您有帮助吗? msdn.microsoft.com/en-us/library/…
  • 似乎没有我要找的东西。
  • 这很新颖。那么“p4952”和“ad1”是什么意思呢?这是你自己的柜台吗?然后发布你用来创建它的代码。
  • 你认为这是我编的吗?这里http://msdn.microsoft.com/en-us/library/dd537616.aspxp 是应用程序ID,ad 是应用程序域。我需要一种以编程方式获取r 的方法。
  • 我感觉这可能是一个内部标识符,只打算在 Profiler 上下文中使用,因为我自己尝试查找它的信息,我发现 zilch excepting i> 分析并行应用程序实例。

标签: c# winforms clr


【解决方案1】:

您可以使用与 .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

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

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

// str -> "Application.exe_p4472_r16_ad1".

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

【讨论】:

  • 非常感谢!我知道有办法获取这些信息。这个方法很完美。我抛弃了旧的“一块一块”构建器并改用它,它自己返回完整的字符串。此外,由于这是性能计数器使用的,我可以肯定它可以在 99% 的机器上运行 :)
  • 获取“Ap​​plication.exe”,使用当前进程的文件名:Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName)
【解决方案2】:

据我所知,无法预测该值将是什么 - 这是来自 MSDN page you linked 的引用(强调我的)

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

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

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

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

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

【讨论】:

  • 我正在监视网络输入/输出我的应用程序。为什么微软在等式中包含这个“未知”变量?之前它只是 appname[appID] 并且使用起来非常简单......现在它真的很混乱。我知道我可以枚举所有实例并找到我的应用程序名称,但我宁愿不这样做。我会继续寻找解决方案。
  • @TheGateKeeper 你不能同时监控两者并求和吗?
  • 我知道我可以将实例名称与在 perfmon 中运行的所有实例隔离开来,但这对我来说不是理想的解决方案。必须有某种方法可以获取此变量,如果将其包含在标识符中,则不可能将其隐藏。
【解决方案3】:

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

此函数拆分实例名称,并搜索唯一以“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));
    }

希望对你有所帮助。

【讨论】:

  • 您好,感谢您的努力,但这没有用。如果我的代码中有完整的字符串,我不需要拆分它来获取 CLR Id,我会按原样使用它。我需要一种从代码中获取 CLR ID 的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
相关资源
最近更新 更多