В дополнение к указанным выше ответов.
я написал следующее test.exe в качестве консольного приложения
static void Main(string[] args) {
Console.WriteLine(
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
Console.WriteLine(
System.Reflection.Assembly.GetEntryAssembly().Location);
Console.WriteLine(
System.Reflection.Assembly.GetExecutingAssembly().Location);
Console.WriteLine(
System.Reflection.Assembly.GetCallingAssembly().Location);
}
Затем я скомпилированный проект и переименовал свой вывод в файл test2.exe. Выходные линии были правильными и одинаковыми.
Но, если я начну его в Visual Studio, результат:
d: \ test2.vhost.exe
d: \ test2.exe
d: \ test2.exe
C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorlib.dll
Подключаемый модуль ReSharper к Visual Studio подчеркивает
System.Diagnostics.Process.GetCurrentProcess().MainModule
как возможно Система.NullReferenceException. Если вы посмотрите на документацию MainModule, вы обнаружите, что это свойство может также вызывать NotSupportedException, PlatformNotSupportedException и InvalidOperationException.
Метод GetEntryAssembly также не на 100% безопасен. MSDN:
Метод GetEntryAssembly может возвращать нуль, когда управляемая сборка была загружена из неуправляемого приложения. Например, если неуправляемое приложение создает экземпляр COM-компонента, написанного в C# , вызов метода GetEntryAssembly из компонента C# возвращает null, поскольку точка входа для процесса была неуправляемой , а не управляемой сборкой ,
Для моих решений я предпочитаю Assembly.GetEntryAssembly().Location
.
Больше интереса, если необходимо решить проблему для виртуализации . Например, у нас есть проект, в котором мы используем Xenocode Postbuild для связывания кода .net в один исполняемый файл. Этот исполняемый файл должен быть переименован. Таким образом, все вышеприведенные методы не работают, потому что они получают информацию только для исходной сборки или внутреннего процесса.
Единственное решение, которое я нашел,
var location = System.Reflection.Assembly.GetEntryAssembly().Location;
var directory = System.IO.Path.GetDirectoryName(location);
var file = System.IO.Path.Combine(directory,
System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");
Этот, как правило, добавляет «.vhost». в имени файла проблема не возникает при использовании System.Reflection.Assembly.GetEntryAssembly(). Location (см. альтернативный ответ). – Contango
@Contango, вызванный использованием «процесса хостинга Visual Studio» в VS. – LuddyPants
Для модульных испытаний в VS 2012. Имя процесса: vstest.executionengine.x86 ConfigurationFile: C: \ TFS \ Tests \ MyData.Tests.v4.0 \ bin \ Debug \ MyData.Tests.v4.0.dll.config MainModule.FileName C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest.executionengine.x86.exe MainModule.ModuleName: vstest.executionengine.x86.exe FriendlyName : UnitTestAdapter: Запуск теста – Kiquenet