使用dotnet单文件发布时如何嵌入配置文件与web.config?
如何将appsettings配置文件与web.config嵌入到.NET 7单文件发布的可执行文件中
要实现把appsettings.json、appsettings.Development.json和web.config嵌入到单文件发布的可执行文件中,只需完成以下两步操作:
1. 修改项目文件(.csproj)
在现有项目配置基础上,添加<ItemGroup>节点,将目标文件标记为嵌入资源,并禁止发布时复制到输出目录:
<PropertyGroup> <TargetFramework>net7.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <PublishSingleFile>true</PublishSingleFile> <SelfContained>true</SelfContained> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <EnableCompressionInSingleFile>true</EnableCompressionInSingleFile> <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract> <DebugType>embedded</DebugType> </PropertyGroup> <!-- 添加以下配置,嵌入目标文件 --> <ItemGroup> <EmbeddedResource Include="appsettings.json"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </EmbeddedResource> <EmbeddedResource Include="appsettings.Development.json"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </EmbeddedResource> <EmbeddedResource Include="web.config"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> <CopyToPublishDirectory>Never</CopyToPublishDirectory> </EmbeddedResource> </ItemGroup>
2. 调整Program.cs的配置加载逻辑
默认情况下ASP.NET Core从文件系统读取配置,现在需要改为从嵌入的程序集资源中读取。注意:嵌入资源的名称格式为[项目命名空间].[文件名],请替换为你实际的项目命名空间。
var builder = WebApplication.CreateBuilder(args); var assembly = typeof(Program).Assembly; // 加载嵌入的appsettings.json using var appSettingsStream = assembly.GetManifestResourceStream("DemoProject.appsettings.json"); if (appSettingsStream != null) { var appSettingsConfig = new ConfigurationBuilder() .AddJsonStream(appSettingsStream) .Build(); builder.Configuration.Merge(appSettingsConfig); } // 开发环境下加载嵌入的appsettings.Development.json if (builder.Environment.IsDevelopment()) { using var devSettingsStream = assembly.GetManifestResourceStream("DemoProject.appsettings.Development.json"); if (devSettingsStream != null) { var devConfig = new ConfigurationBuilder() .AddJsonStream(devSettingsStream) .Build(); builder.Configuration.Merge(devConfig); } } // 若需要在运行时读取web.config的配置,可添加以下逻辑(仅在必要时使用) // using var webConfigStream = assembly.GetManifestResourceStream("DemoProject.web.config"); // if (webConfigStream != null) // { // var webConfig = new ConfigurationBuilder() // .AddXmlStream(webConfigStream) // .Build(); // builder.Configuration.Merge(webConfig); // } // 后续服务、中间件配置保持不变 builder.Services.AddControllers(); var app = builder.Build(); // 中间件配置 app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
3. 执行发布命令
继续使用原发布命令:
dotnet publish -r win-x64
发布完成后,发布目录中仅会生成单个可执行文件,所有配置文件已嵌入其中。
内容的提问来源于stack exchange,提问作者zhenghao li
相关产品推荐
相关产品推荐

