2016-08-27 39 views
4

我一直用這個代碼,即可獲得我的程序版本的該電流的.exe可執行文件版本:C#如何獲得

public string progVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); 

然而,這並不似乎總是搶我期待的版本。我真的不明白這是如何完全運作或它正在做什麼。

我認爲這是傳遞,因爲我從另一個程序啓動我的程序,然後它似乎抓住啓動它的程序的版本,或'GetExecutingAssembly()'我假設引用執行的程序我的程序,就像這樣:

System.Diagnostics.Process.Start(my_programs_path); 

有沒有更可靠的方式,在我要求它的時間來獲得實際的程序的程序版本?

也許甚至啓動我的程序而不留下某種痕跡,就好像用戶自己剛剛啓動它一樣。

感謝您的幫助!

+0

我開始思考什麼我遇到的是由於別的原因造成的某種異常,因爲我不是能夠複製它。 – Eric

回答

0

GetExecutingAssembly()返回包含thaτ調用它的方法組裝。如果您從庫中調用它,您將始終獲得庫的版本而不是應用程序的可執行文件。

獲取應用程序的可執行文件使用GetEntryAssembly()

請看下面的例子:

在AssemblyA:

class VersionTest 
{ 
    void Test() 
    { 
    Console.Write("Executing assembly: {0}\n", Assembly.GetExecutingAssembly().GetName().ToString()); // returns AssemblyA 
    Console.Write("Entry assembly: {0}\n", Assembly.GetEntryAssembly().GetName().ToString());   // returns AssemblyB 
    } 
} 

在AssemblyB:

class Program 
{ 
    void Main() 
    { 
     var ver = new VersionTest(); 
     ver.Test(); 
    } 
} 
+0

這就是我正在尋找的。謝謝! – Eric

2

您可以使用已知類型的Assembly屬性,通過在應用程序中定義的typeof來確保您獲得了「正確」的程序集,然後檢索該程序的版本(例如,

typeof(YourKnownType).Assembly.GetName().Version.ToString(); 
+0

如果上述代碼位於類庫組件中,則無法知道(甚至是否有引用)主(.exe)應用程序程序集中的類型。因此它不能用於返回應用程序的版本.exe –