如何发布不含Microsoft DLL的.NET Core 2 API项目?
如何发布不包含.NET Core框架Microsoft DLL的.NET Core 2 API项目
Got it, let's work through how to publish your .NET Core 2 API so it doesn't include those Microsoft framework DLLs. First, we need to draw a clear line between two types of Microsoft DLLs you're seeing:
- .NET Core Runtime框架DLL: 这类是.NET Core 2.x官方运行时的一部分(比如
Microsoft.AspNetCore.Antiforgery.dll或Microsoft.AspNetCore.Authentication.Abstractions.dll),我们可以完全避免打包它们。 - NuGet引入的Microsoft类库: 像
Microsoft.ApplicationInsights.AspNetCore.dll或log4net.dll这类是你添加到项目的包,如果代码用到了它们的功能,就需要保留,除非移除对应的引用。
以下是具体解决步骤:
1. 使用框架依赖部署(FDD)模式
.NET Core的框架依赖部署模式假设目标服务器已经安装了.NET Core 2.x运行时,因此不需要打包运行时自带的框架DLL。
执行发布命令时明确指定框架依赖模式(虽然.NET Core 2中默认就是这个模式,但显式指定更保险):
dotnet publish -c Release -f netcoreapp2.x -o build --self-contained false
- 把
netcoreapp2.x替换成你项目实际使用的目标框架版本(2.0、2.1或2.2) -c Release确保发布的是经过优化的生产环境代码--self-contained false告诉CLI不要打包整个运行时
2. 检查项目.csproj配置
打开项目的.csproj文件,确保没有强制开启独立部署的配置:
<PropertyGroup> <!-- 确保这项设为false(或者不写,默认就是false) --> <SelfContained>false</SelfContained> <!-- 对于ASP.NET Core项目,保持这项启用(默认启用),它会帮助识别哪些是框架组件 --> <PublishWithAspNetCoreTargetManifest>true</PublishWithAspNetCoreTargetManifest> </PropertyGroup>
如果看到<SelfContained>true</SelfContained>,改成false后再执行发布。
3. 处理NuGet引入的Microsoft类库
你列出的Microsoft.ApplicationInsights.*或log4net.dll这类文件来自你引用的NuGet包,它们不属于核心运行时,所以会被包含在发布目录中。如果想移除它们:
- 从项目中卸载对应的NuGet包(比如如果不需要遥测功能,就移除
Microsoft.ApplicationInsights.AspNetCore) - 更新代码,确保没有使用这些库的功能,避免编译错误
4. 验证发布结果
发布完成后,查看build目录,你应该只会看到:
- 项目主DLL(比如
KalturaClient.Net.Core.dll) - 非框架的NuGet依赖DLL(如果保留了引用的话)
- 本地化资源文件夹(
de、es等,如果不需要可以通过项目配置排除) - 配置文件(比如
log4net.config)
而.NET Core核心框架的DLL不会再出现在目录中——它们会从目标服务器上安装的运行时加载。
内容的提问来源于stack exchange,提问作者Mortalus




