是否有任何地方可以在运行时获取当前应用程序的CLR ID?我正在使用性能监视器监视我的系统,实例使用的名称是:
ApplicationName.exe_p4952_r15_ad1我可以通过编程方式获取所有其他参数,但不能获取r15,它是执行代码的公共语言运行时(实例)的运行时ID。我注意到它总是15,但最好是动态获取它,以避免复杂性。
发布于 2012-04-26 15:49:00
您可以使用与.NET框架相同的基础架构(例如性能计数器)来获取整个“后缀”,即Application.exe之后的部分。
有一个方法System.Runtime.Versioning.VersioningHelper.MakeVersionSafeName,它可以做到这一点。请注意,该方法被描述为“基础结构”和“此应用程序接口支持.NET框架基础结构,并且不打算直接在您的代码中使用”,但它仍然是公共的。我不认为有任何“更好的支持”的方式来获得你想要的信息。至少它更健壮,对未来的变化更有弹性,然后基于文档对信息进行逆向工程。
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(),但考虑到上面的情况,我认为没有必要使用反射来实现您所需要的。
发布于 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组件,就会发生这种情况),那么您只需要同时监视这两个组件。
你能提供更多关于你正在尝试做的事情的信息吗?
发布于 2012-04-25 23:17:19
通过拆分得到的字符串,你可以很容易地找到它:
此函数拆分实例名称,并搜索以"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));
}我希望我能帮到你。
https://stackoverflow.com/questions/10196432
复制相似问题