2011-10-24 126 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 
相关问题