Как найти текущее исполняемое имя файла? [дубликат]




Возможные Дубликаты:
как получить имя текущего исполняемого файла в C#?






исполняемый файл загружает внешнюю библиотеку.

Есть ли способ для библиотеки узнать вызывающий исполняемый файл?



(Я мог бы поклясться, что видел ответ на этот вопрос в другом месте, но я больше не могу его найти)

490   7  

7 ответов:

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

Если вы хотите, чтобы исполняемый файл:

System.Reflection.Assembly.GetEntryAssembly().Location

Если вы хотите, чтобы сборка, которая потребляет вашу библиотеку (которая может быть той же сборкой, что и выше, если ваш код вызывается непосредственно из класса в вашем исполняемом файле):

System.Reflection.Assembly.GetCallingAssembly().Location

Если вы хотите просто файломимя а не путь, используйте:

Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location)

в дополнение к ответам выше.

Я написал следующий тест.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.виртуальный хост.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 может возвращать значение null, когда управляемая сборка был загружен из неуправляемого приложения. Например, если неуправляемое приложение создает экземпляр 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");

окружающая среда.GetCommandLineArgs()[0]

Я думаю, что это должно быть то, что вы хотите:

System.Reflection.Assembly.GetEntryAssembly().Location

это возвращает сборку, которая была впервые загружена при запуске процесса, который, казалось бы, то, что вы хотите.

GetCallingAssembly Не обязательно возвращает сборку, которую вы хотите в общем случае, так как она возвращает сборку, содержащую метод сразу выше в стеке вызовов (т. е. она может быть в той же DLL).

Assembly.GetEntryAssembly()

этот не был включен:

System.Windows.Forms.Application.ExecutablePath;

~Joe

Comments

    Ничего не найдено.