是否有任何地方可以在运行时为当前应用程序获取 CLR ID?我正在使用性能监视器监视我的系统,用于实例的名称是:
ApplicationName.exe_p4952_r15_ad1
我可以通过编程方式获取所有其他参数,但不能获取r15
执行代码的公共语言运行时(实例)的运行时 ID。我注意到它总是 15,但最好动态获取它以避免并发症。
您可以获得整个“后缀”,即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()
,但鉴于上述情况,我认为没有必要使用反射来实现您所需要的。
据我所知,无法预测该值将是什么 - 这是您链接的 MSDN 页面的引用(强调我的)
runtimeID 是公共语言运行时标识符。
这篇文章有点令人困惑,因为它提供了一个示例,其中一个应用程序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));
}
我希望我对你有所帮助。