如何发布.NET 8 NativeAot WebAPI单文件并移除appsettings.json与sni.dll
.NET 8 NativeAot WebAPI 单文件发布配置
一、嵌入 appsettings.json 到单文件
修改项目文件(.csproj)
在项目文件中添加配置,将appsettings.json标记为嵌入资源并禁止其复制到输出目录:<ItemGroup> <EmbeddedResource Include="appsettings.json"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> </EmbeddedResource> </ItemGroup>同时在 NativeAot 配置区域启用全资源嵌入:
<PropertyGroup> <PublishAot>true</PublishAot> <EmbedAllResources>true</EmbedAllResources> </PropertyGroup>修改配置加载逻辑(Program.cs)
替换默认的文件读取逻辑,从嵌入资源中加载配置:var assembly = typeof(Program).Assembly; // 替换为你的项目命名空间 + appsettings.json using var configStream = assembly.GetManifestResourceStream("YourProjectName.appsettings.json"); if (configStream == null) { throw new InvalidOperationException("未找到嵌入的 appsettings.json,请检查资源命名是否正确"); } var builder = WebApplication.CreateBuilder(args); // 添加嵌入的JSON配置流 builder.Configuration.AddJsonStream(configStream); // 后续服务注册、中间件配置保持原有逻辑即可
二、嵌入 sni.dll 至单文件
sni.dll是 SQL Server 客户端的本地依赖库,默认会单独输出。要将其嵌入单文件,在项目文件中添加以下配置:
<PropertyGroup> <!-- 启用本地库嵌入 --> <EmbedNativeLibraries>true</EmbedNativeLibraries> <!-- 禁止本地库自提取,直接嵌入到EXE --> <IncludeAllNativeLibrariesForSelfExtract>false</IncludeAllNativeLibrariesForSelfExtract> </PropertyGroup> <ItemGroup> <!-- 指定要嵌入的sni.dll --> <NativeLibrary Include="sni.dll" /> </ItemGroup>
若项目未直接引用 SQL Server 相关包却出现该文件,可排查间接依赖;若确认无需该库,也可通过<ExcludeNativeLibrariesFromPublish Include="sni.dll" />直接排除,但不推荐,避免运行时出现依赖缺失。
最终发布命令
执行以下命令完成单文件发布:
dotnet publish -c Release -r win-x64 --self-contained true
内容的提问来源于stack exchange,提问作者Amit Limbasiya
相关产品推荐
相关产品推荐

