Как получить имя .exe консольного приложения C #? - PullRequest
20 голосов
/ 24 октября 2011

Я отлаживаю "xiixtasks.exe", приложение консольного режима C # в VS2008.

Я пытаюсь получить информацию о версии из 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) Первоначальной проблемой была оболочка vshost в IDE. Одним из обходных путей было бы изменение настроек сборки.

2) Assembly.GetExecutingAssembly (). CodeBase - это превосходное решение - спасибо !. Он работает внутри и снаружи отладчика.

3) К сожалению, когда я попытался вызвать его с помощью функции, которая ожидала нормального пути к файлу (вместо URI, такого как GetExecutingAssembly () «дает вам»), он умер с исключением «Форматы 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);
}

Еще раз спасибо всем!

Ответы [ 9 ]

31 голосов
/ 24 октября 2011

Полный путь вашей сборки:

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

Вы всегда можете извлечь имя с помощью Path.GetFileName:

string codeBase = Assembly.GetExecutingAssembly().CodeBase;
string name = Path.GetFileName(codeBase);
11 голосов
/ 24 октября 2011

Похоже, что вы работаете в среде IDE в режиме отладки с включенным флажком «Включить процесс размещения Visual Studio». В этом случае текущий процесс равен xiixtasks.vshost.exe - это исполняемый файл оболочки, используемый для отладки. Вам необходимо отключить этот флажок.

enter image description here

4 голосов
/ 25 октября 2011

В зависимости от того, какую информацию вы хотите, вы можете использовать различные звонки:

enter image description here

3 голосов
/ 24 октября 2011

Попробуйте получить версию:

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

И это, чтобы получить имя:

System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString()
2 голосов
/ 03 июня 2017

Это также даст вам имя / версию

name: Assembly.GetExecutingAssembly().GetName().Name
version: = Assembly.GetExecutingAssembly().GetName().Version
2 голосов
/ 24 октября 2011

Оболочка 'vshost.exe', как правило, включена только для отладочных сборок, и ее также не нужно использовать, поэтому, возможно, вам стоит просто отключить ее в настройках вашего проекта (вкладка «Отладка», снимите флажок «Включить Visual Studio»). процесс хостинга "внизу).

2 голосов
/ 24 октября 2011

На самом деле это то, что я ожидал, так как он фактически выполняет файл vshost в режиме отладки.

Если вы не хотите, чтобы он выполнял файл vshost, а, скорее, ваш exe-файл напрямую, вам нужно зайти в настройки вашего проекта и отключить опцию отладки vshost.

1 голос
/ 31 мая 2012

Если вы получите исключение типа «Формат 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 голос
/ 24 октября 2011

попробуй

var asm = Assembly.GetExecutingAssembly();

...