21

我正在调试 VS2008 中的 C# 控制台模式应用程序“xiixtasks.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);
}

再次感谢大家!

4

9 回答 9

34

程序集的完整路径:

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

您始终可以使用以下命令提取名称Path.GetFileName

string codeBase = Assembly.GetExecutingAssembly().CodeBase;
string name = Path.GetFileName(codeBase);
于 2011-10-24T19:55:49.110 回答
11

听起来您正在调试中运行 IDE,并启用了“启用 Visual Studio 托管进程”复选框。在这种情况下,当前进程 xiixtasks.vshost.exe- 它是一个用于帮助调试的 shell exe。您需要禁用该复选框。

在此处输入图像描述

于 2011-10-24T19:56:03.483 回答
4

试试这个来获取版本:

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

这得到了名字:

System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString()
于 2011-10-24T19:54:42.683 回答
4

根据您想要的信息,您可以使用各种调用:

在此处输入图像描述

于 2011-10-24T20:02:53.583 回答
2

这实际上是我所期望的,因为它实际上是在调试模式下执行 vshost 文件。

如果您不希望它执行 vshost 文件而是直接执行您的 exe,则需要进入项目设置并禁用 vshost 调试选项。

于 2011-10-24T19:56:12.277 回答
2

'vshost.exe' 包装器通常仅对调试版本启用,也没有必要使用它,因此也许您应该考虑在项目设置下将其关闭(调试选项卡,取消选中“启用 Visual Studio 托管进程”在底部)。

于 2011-10-24T19:58:06.083 回答
2

这也会让你得到名字/版本

name: Assembly.GetExecutingAssembly().GetName().Name
version: = Assembly.GetExecutingAssembly().GetName().Version
于 2017-06-03T17:30:08.287 回答
1

尝试

var asm = Assembly.GetExecutingAssembly();

于 2011-10-24T19:56:29.283 回答
1

如果使用以下代码将 xml 文件从一个目录复制到另一个目录时出现“不支持 URI 格式”等异常。

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);

然后用它来获取文件。

于 2012-05-31T13:18:44.637 回答