2012-04-17 29 views
8

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

ApplicationName.exe_p4952_r15_ad1 

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

+0

使用Process.GetProcesses可以帮助你吗? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses.aspx – 2012-04-17 18:16:34

+0

似乎没有我在找什么。 – TheGateKeeper 2012-04-17 18:27:27

+0

这是新颖的。那么“p4952”和“ad1”是什么意思?这是你自己的柜台吗?然后发布您用来创建它的代码。 – 2012-04-17 18:56:20

回答

3

您可以使用与.NET框架(例如peformance计数器)相同的基础结构获取整个“后缀”,即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

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

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

// str -> "Application.exe_p4472_r16_ad1". 

VersioningHelpers也有私有方法GetRuntimeId(),但鉴于以上情况,我不认为这里有必要使用上反射达到你所需要的。

+0

非常感谢!我知道有一种方法可以获得这些信息。这种方法是完美的。我甩掉了旧的“逐件”构建器,并用它代替,它自己返回完整的字符串。另外,因为这是性能计数器使用的东西,所以我可以肯定它可以在99%的机器上运行:) – TheGateKeeper 2012-05-03 12:17:06

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)); 
    } 

我希望我帮你。

+0

嗨,感谢您的努力,但这是无用的。如果我在代码中以某种方式获得了完整的字符串,那么我不需要将其拆分为获得CLR ID,我只是按照原样使用它。我需要一种方法从代码中获取CLR ID。 – TheGateKeeper 2012-04-25 15:38:29

1

至于我可以看到有没有办法预测值将是什么 - 这里是从MSDN page you linked(重点煤矿)报价

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

的制品是略微混乱,因为它给出了一个例子,由此应用程序myapp.exe主机上的两个CLR在两个实例显示为具有不同的进程ID,但相同的CLR运行时ID的例子然而运行时。

这篇文章显然没有给出CLR运行时ID的价值或者如何找到它的任何承诺(它甚至没有说明它的数字),这暗示了它的一个内在的东西,你不应该依靠能够解决它的问题。

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

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

+0

我正在监视网络进出我的应用程序。为什么微软在等式中包含这个“未知”变量?在它仅仅是appname [appID]之前,它的使用非常简单...现在它真的让人困惑。我知道我可以枚举所有实例并找到我的应用程序名称,但我宁愿不这样做。我会继续寻找解决方案。 – TheGateKeeper 2012-04-25 16:22:21

+0

@TheGateKeeper在那你可以不只是监测和总结价值? – Justin 2012-04-25 16:28:18

+0

我知道我可以从perfmon中运行的所有实例中分离实例名称,但这不是我理想的解决方案。必须有一些方法来获得这个变量,如果将它包含在一个标识符中,这是不可能的。 – TheGateKeeper 2012-04-25 16:33:42