C# Как получить путь к исполняемым файлам "Автономный" и "PublishSingleFile"?

У меня есть каталог, содержащий автономный exe и файл конфигурации. EXE должен прочитать этот файл конфигурации. Но проблема в том, что exe не может получить правильный путь к этому файлу конфигурации.

Позвольте мне сначала рассказать о том, как я это сделал.

1. Создайте проект NET5.0 в VS2019

2, добавить коды

       using System;
using System.IO;
using System.Reflection;

namespace TestFile {
    class Program {
        static void Main(string[] args) {
            string assemblyLocation = Assembly.GetEntryAssembly().Location;
            Console.WriteLine($"assemblyLocation=\"{assemblyLocation}\"");
            string configFile = Path.Combine((new FileInfo(assemblyLocation)).DirectoryName, "test.conf");
            Console.WriteLine($"configFile=\"{configFile}\"");
            File.ReadAllText(configFile);
        }
    }
}

3. Опубликуйте этот проект в автономном и PublishSingleFile exe.

4. Добавьте файл test.conf в каталог, в котором находится исполняемый файл.

5, запустите этот exe

Как я могу получить правильный путь к этому файлу конфигурации? пожалуйста помоги! Благодарю.

2 ответа

Решение

Взгляните на этот вопрос: как я могу заставить однофайловое приложение.NET Core 3 найти файл appsettings.json?

Автономные приложения.NET Core автоматически распаковываются во временную папку. Таким образом, путь к опубликованному исполняемому файлу отличается от пути к фактически выполненной сборке.

Вот так вы должны использовать это: Path.GetDirectoryName(Process.GetCurrentProcess().MainModule)

Я прочитал, что рекомендуемый способ был Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName), однако для меня это вернуло значение null (.NET 6). Я подозреваю, что это потому, что код был в DLL из другого проекта. В любом случае, более надежный метод, по-видимому, AppContext.BaseDirectory. Он используется .NET для поиска зависимостей сборки и указывает на базовый каталог приложения. Довольно легко запомнить и сразу даст вам каталог, а не имя файла!

Другие вопросы по тегам