2012-04-17 66 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