Как получить имя.exe консольного приложения C#?
Я отлаживаю "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 ответов
Полный путь вашей сборки:
Assembly.GetExecutingAssembly().CodeBase.Dump();
Вы всегда можете извлечь имя с Path.GetFileName
:
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
string name = Path.GetFileName(codeBase);
Похоже, что вы работаете в среде IDE в режиме отладки с включенным флажком "Включить процесс размещения Visual Studio". В этом случае текущий процесс xiixtasks.vshost.exe
- это оболочка, используемая для отладки. Вы должны отключить этот флажок.
Это также даст вам имя / версию
name: Assembly.GetExecutingAssembly().GetName().Name
version: = Assembly.GetExecutingAssembly().GetName().Version
В зависимости от того, какую информацию вы хотите, вы можете использовать различные звонки:
Попробуйте это, чтобы получить версию:
System.Reflection.Assembly.GetExecutingAssembly().GetName().Version
И это, чтобы получить имя:
System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString()
На самом деле это то, что я ожидал, так как фактически он выполняет файл vshost в режиме отладки.
Если вы не хотите, чтобы он выполнял файл vshost, а, скорее, непосредственно исполняемый файл, вам нужно зайти в настройки вашего проекта и отключить опцию отладки vshost.
Оболочка 'vshost.exe', как правило, включена только для сборок Debug, и ее также не нужно использовать, поэтому, возможно, вам следует просто отключить ее в настройках вашего проекта (вкладка "Отладка", снимите флажок "Включить процесс размещения Visual Studio"). внизу).
Если вы получите исключение типа "Формат 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);
затем используйте его, чтобы получить файлы.