對於ClickOnce應用程式,我們可以通過ActivationContext(啟用上下文),該類可以提供應用程式資訊清單(Application Manifest)的訪問。通過AppDomain.ActivationContext可以擷取當前應用程式定義域的啟用上下文。ActivationContext目前有四個屬性,Application(或Deploy)ManifestBytes可以擷取ClickOnce應用程式(或者部署)清單數組。而Form屬性(對應一個枚舉值)表示是否在ClickOnce儲存區。
文章的主要內容就是上述ActivationContext的4個屬性中的Identity屬性,來擷取一個應用程式識別碼:ApplicationIdentity類(在System命名空間)。
而ApplicationIdentity類的FullName屬性幾乎包含了這個ClickOnce應用程式的所有程式資訊(包括CodeBase),其次ApplicationIdentity.CodeBase屬性是程式部署資訊清單的URL。
注意:
如果要運行如下代碼,請確保應用程式以ClickOnce部署。
對於控制台程式,最好在程式結尾加入Console.ReadKey方法,否則會無法看到輸出。
Console.ReadKey(true);
代碼:
var appIdenity = AppDomain.CurrentDomain.ActivationContext.Identity;
Console.WriteLine(appIdenity.FullName);
Console.WriteLine(appIdenity.CodeBase);
輸出(注意FullName包含很多資訊):
對於更詳細的資訊,可以構造一個ApplicationSecurityInfo類型(通過ActivationContext類型),ApplicationSecurityInfo的ApplicationId返回一個ApplicationId對象。ApplicationId包含諸多資訊,比如名稱,版本,文化資訊,公開金鑰標記。
代碼(注意ApplicationSecurityInfo在System.Security.Policy命名空間內,而ApplicationId在System命名空間內):
//+ using System.Security.Policy;
var appSecurInf = new ApplicationSecurityInfo(AppDomain.CurrentDomain.ActivationContext);
var appId = appSecurInf.ApplicationId;
Console.WriteLine(appId.Name);
Console.WriteLine(appId.Version);
Console.WriteLine(appId.ProcessorArchitecture);
Console.WriteLine(BitConverter.ToString(appId.PublicKeyToken));
Console.WriteLine("列舉Evidence");
var iter = appSecurInf.ApplicationEvidence.GetHostEnumerator();
while(iter.MoveNext())
Console.WriteLine(iter.Current.ToString());
輸出: