Как создать единый exe-файл без app.dll.config?

Рейтинг: 0Ответов: 2Опубликовано: 03.05.2023

Несмотря на выбор "Создать отдельный файл" в параметрах профиля публикации, в результате всё равно VS рядом с appName.exe создаёт файлы appName.dll.config и appName.pdb. И если pdb-файл, как я понимаю, нужен только для отладки и может быть спокойно удалён, то без config-файла приложение работать не будет.

appName.dll.config был создан автоматически и хранит информацию с первоначальными настройками, установленными мной в Properties.Settings.

Так как всё-таки перенести config в exe? Или изменить способ хранения настроек, чтобы не требовались дополнительные файлы вовсе?

Параметры профиля

Результат

Ответы

▲ 0Принят

Всем спасибо за советы. Проблему решило удаление файла user.config в AppData, оставшегося от предыдущей публикации. После этого удаление appName.dll.config не мешает работе приложения.

▲ 2

При необходимости конфигурацию "зашить" в исполняемый файл, для этого в файле проекта нужно добавить следующие строчки:

    <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
      <Exec Command="copy $(TargetDir)\$(TargetName).dll.config $(ProjectDir)\$(TargetName).dll.config" />
    </Target>
    
    <ItemGroup>
        <None Remove="appName.dll.config" />
        <EmbeddedResource Include="appName.dll.config">
            <LogicalName>appName.dll.config</LogicalName>
        </EmbeddedResource>
    </ItemGroup>

Содержимое файла можно получить например вот через такую функцию:

    public static string LoadDllConfig()
    {
        var assembly = AssemblyLoadContext.All.SelectMany(alc => alc.Assemblies).Single(asm => asm.GetManifestResourceNames().Any(resourceName => resourceName.EndsWith(".dll.config")));
        var resourceName = assembly.GetManifestResourceNames().Single(resourceName => resourceName.EndsWith(".dll.config"));
        using var streamReader = new StreamReader(assembly.GetManifestResourceStream(resourceName)!);
        return streamReader.ReadToEnd();
    }