2011-10-24 124 views
18

我正在調試VS2008中的C#控制檯模式應用程序「xiixtasks.exe」。如何獲取C#控制檯應用程序的.exe名稱?

我試圖從xiixtasks.exe獲取版本信息。

當我嘗試 「Process.GetCurrentProcess()」,它給了我vshost.exe文件名和版本信息,而不是xiixtasks.exe:

// WRONG: this gives me xiixtasks.vhost.exe, version 9.0.30729.1 
    //  I *want* "xiixtasks.exe", version 1.0.0.1024 
    System.Diagnostics.FileVersionInfo fi = 
    System.Diagnostics.Process.GetCurrentProcess().MainModule.FileVersionInfo; 

什麼我應該不是做?

預先感謝您!

============================================== ========

解決方案:

1)最初的問題確實是IDE的 「vshost」 包裝。 一種解決方法是更改​​構建設置。

2)Assembly.GetExecutingAssembly()。CodeBase是一個優秀的解決方案 - 謝謝!它在調試器內外工作。 3)不幸的是,當我試圖用一個預期爲正常文件路徑的函數調用它(而不是像GetExecutingAssembly()這樣的URI)時,它會以「不支持Uri格式」的異常爲例

4)最終解決方案:調用GetExecutingAssembly(),然後Uri.LocalPath():

... 
else if (cmdArgs.cmd.Equals(CmdOptions.CMD_SHOW_VERSION)) 
{ 
    string codeBaseUri = 
     Urifile.System.Reflection.Assembly.GetExecutingAssembly().CodeBase; 
    string codeBase = 
     new Uri (codeBaseUri).LocalPath; 
    string sVersion = Util.GetWindowsVersion(codeBase); 
    System.Console.WriteLine ("version({0}): {1}: ", 
     Util.Basename(codeBase), sVersion); 
} 

再次感謝你,所有

回答

23

程序集的完整路徑:

Assembly.GetExecutingAssembly().CodeBase.Dump(); 

您可以隨時與Path.GetFileName提取名稱:

string codeBase = Assembly.GetExecutingAssembly().CodeBase; 
string name = Path.GetFileName(codeBase); 
+1

我推薦這個。字符串全名= System.Reflection.Assembly.GetExecutingAssembly()。位置; – Lin

+0

您也可以使用ManifestModule的Name屬性:Assembly.GetExecutingAssembly()。ManifestModule.Name – Rafael

3

嘗試使用此方法得到的版本:

System.Reflection.Assembly.GetExecutingAssembly().GetName().Version 

這讓名稱:

System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString() 
10

這聽起來就像在IDE中運行「啓用Visual Studio託管過程」chec一樣啓用kbox。在這種情況下,當前進程xiixtasks.vshost.exe - 它是一個shell的exe文件,用於幫助調試。您需要禁用該複選框。

enter image description here

+2

的確如此,如果您在IDE之外運行應用程序,則應返回xiixtasks.exe。 – eandersson

+0

在IDE之外,它工作正常。謝謝你們! – paulsm4

+0

附錄 - 如果我調用.GetExecutingAssembly()。CodeBase而不是Process.GetCurrentProcess()。MainModule,那麼無論調試設置如何,它都可以在IDE內部和外部工作。 – paulsm4

2

這實際上是我所期待的,因爲它實際上是執行在調試模式下vshost文件。

如果您不希望它直接執行vshost文件而是執行您的exe文件,則需要進入項目設置並禁用vshost調試選項。

1

嘗試

var asm = Assembly.GetExecutingAssembly();

+1

大部分是這樣的:字符串exeName = Assembly.GetExecutingAssembly()。ManifestModule.ToString(); – GianT971

2

的「vshost.exe」包裝一般只用於調試版本啓用,它也沒有必要使用它,那麼也許你應該只考慮你的項目下將其關閉設置(調試選項卡,取消選中「在底部啓用Visual Studio託管過程」)。

4

取決於你想要什麼樣的信息,您可以使用各種電話:

enter image description here

1

如果你將得到的異常,如「不支持URI格式」雖然從一個目錄複製xml文件通過使用下面的代碼到另一個。

string path=System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); 
DirectoryInfo dir=new DirectoryInfo(path+"\\App2"); 
FileInfo[] Files=dir.GetFiles(); 

然後將其轉換爲URI。

string path =Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); 
URI uri = new URI(path); 
string FileName = Path.Combine(uri.LocalPath, "\\App2"+file.Name); 

然後用它來獲取文件。

1

這也將讓你的名字/版本

name: Assembly.GetExecutingAssembly().GetName().Name 
version: = Assembly.GetExecutingAssembly().GetName().Version 
相關問題