Я отлаживаю "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;
Что мне следует делать вместо этого?
Решение:
Первоначальной проблемой действительно была оболочка IDE «vshost».
Одним из обходных путей было бы изменение настроек сборки.
Assembly.GetExecutingAssembly().CodeBase — отличное решение — спасибо! Он работает внутри и вне отладчика.
К сожалению, когда я попытался вызвать его с помощью функции, которая ожидала нормальный путь к файлу (вместо URI, такого как GetExecutingAssembly()), он умер с исключением «Форматы Uri не поддерживаются».
Окончательное решение: вызовите GetExecutingAssembly(), затем Uri.LocalPath():
Я отлаживаю "xiixtasks.exe", консольное приложение C# в VS2008. Я пытаюсь получить информацию о версии из xiixtasks.exe. Когда я пытаюсь выполнить "Process.GetCurrentProcess()", он дает мне имя файла и информацию о версии vshost.exe, а НЕ xiixtasks.exe: [code] // 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; [/code] Что мне следует делать вместо этого?
Решение: [list] [*]Первоначальной проблемой действительно была оболочка IDE «vshost». Одним из обходных путей было бы изменение настроек сборки.
[*]Assembly.GetExecutingAssembly().CodeBase — отличное решение — спасибо! Он работает внутри и вне отладчика.
[*]К сожалению, когда я попытался вызвать его с помощью функции, которая ожидала нормальный путь к файлу (вместо URI, такого как GetExecutingAssembly()), он умер с исключением «Форматы Uri не поддерживаются».
[*]Окончательное решение: вызовите GetExecutingAssembly(), затем Uri.LocalPath(): [code] ... 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); } [/code]