有什麼地方可以在運行時爲當前應用程序獲取CLR ID?我使用性能監視器並用於實例的名稱監視我的系統是:獲取CLR ID
ApplicationName.exe_p4952_r15_ad1
我可以得到所有其他參數編程而不是r15
這是公共語言運行庫(實例)執行的運行ID你的代碼。我注意到它總是15,但最好動態獲取以避免併發症。
有什麼地方可以在運行時爲當前應用程序獲取CLR ID?我使用性能監視器並用於實例的名稱監視我的系統是:獲取CLR ID
ApplicationName.exe_p4952_r15_ad1
我可以得到所有其他參數編程而不是r15
這是公共語言運行庫(實例)執行的運行ID你的代碼。我注意到它總是15,但最好動態獲取以避免併發症。
您可以使用與.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()
,但鑑於以上情況,我不認爲這裏有必要使用上反射達到你所需要的。
非常感謝!我知道有一種方法可以獲得這些信息。這種方法是完美的。我甩掉了舊的「逐件」構建器,並用它代替,它自己返回完整的字符串。另外,因爲這是性能計數器使用的東西,所以我可以肯定它可以在99%的機器上運行:) – TheGateKeeper 2012-05-03 12:17:06
您可以通過拆分你得到的字符串很容易地找到它:
此功能拆分實例名,並搜索以「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。 – TheGateKeeper 2012-04-25 15:38:29
至於我可以看到有沒有辦法預測值將是什麼 - 這裏是從MSDN page you linked(重點煤礦)報價
runtimeID是一個公共語言運行庫標識符。
的製品是略微混亂,因爲它給出了一個例子,由此應用程序myapp.exe
主機上的兩個CLR在兩個實例顯示爲具有不同的進程ID,但相同的CLR運行時ID的例子然而運行時。
這篇文章顯然沒有給出CLR運行時ID的價值或者如何找到它的任何承諾(它甚至沒有說明它的數字),這暗示了它的一個內在的東西,你不應該依靠能夠解決它的問題。
我的方法可能是枚舉所有Perfmon計數器並監視其中任何與您的PID匹配的計數器。如果有多個(如果您使用的是任何.Net 2.0組件,將會發生這種情況),那麼您只需要同時監視這兩個組件。
你可以提供更多關於你想要做什麼的信息嗎?
我正在監視網絡進出我的應用程序。爲什麼微軟在等式中包含這個「未知」變量?在它僅僅是appname [appID]之前,它的使用非常簡單...現在它真的讓人困惑。我知道我可以枚舉所有實例並找到我的應用程序名稱,但我寧願不這樣做。我會繼續尋找解決方案。 – TheGateKeeper 2012-04-25 16:22:21
@TheGateKeeper在那你可以不只是監測和總結價值? – Justin 2012-04-25 16:28:18
我知道我可以從perfmon中運行的所有實例中分離實例名稱,但這不是我理想的解決方案。必須有一些方法來獲得這個變量,如果將它包含在一個標識符中,這是不可能的。 – TheGateKeeper 2012-04-25 16:33:42
使用Process.GetProcesses可以幫助你嗎? http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses.aspx – 2012-04-17 18:16:34
似乎沒有我在找什麼。 – TheGateKeeper 2012-04-17 18:27:27
這是新穎的。那麼「p4952」和「ad1」是什麼意思?這是你自己的櫃檯嗎?然後發佈您用來創建它的代碼。 – 2012-04-17 18:56:20