Deployment 优化.NET核心自包含部署

Deployment 优化.NET核心自包含部署,deployment,.net-core,Deployment,.net Core,我正在开发一个简单的、跨平台的.NET应用程序。我需要将其作为一个自包含的部署分发,因为我不能假设.NET是否已经安装 .NET publish for Windows 10 64位生成64 MB目录。我很确定大多数DLL文件是不需要的。是否有办法优化分发,以便只保留必要的DLL文件?更新2020:这现在是工具链的一部分,请参见Pawel的答案 此任务可以通过使用IL链接器来完成。通过向项目中添加NuGet包,可以删除不需要的代码,从而减小已发布的自包含应用程序的大小。然而,它仍处于预览阶段(截

我正在开发一个简单的、跨平台的.NET应用程序。我需要将其作为一个自包含的部署分发,因为我不能假设.NET是否已经安装


.NET publish for Windows 10 64位生成64 MB目录。我很确定大多数DLL文件是不需要的。是否有办法优化分发,以便只保留必要的DLL文件?

更新2020:这现在是工具链的一部分,请参见Pawel的答案


此任务可以通过使用IL链接器来完成。通过向项目中添加NuGet包,可以删除不需要的代码,从而减小已发布的自包含应用程序的大小。然而,它仍处于预览阶段(截至2017年)。有关自包含的应用程序,请参见和。

我也面临同样的问题。到目前为止,我的发现如下:

Microsoft发布了一个用于查找未使用的程序集并将其删除的

使用.NET CLI:

  • dotnet添加包Microsoft.Packaging.Tools.Trimming-v1.1.0-preview1-25818-01
  • dotnet发布-r win-x64-c发布/p:trimunseddependencies=true
应用程序的占用空间现在小得多(通常)


为了获得更好的优化效果,您可以将其与iLink一起使用:

  • dotnet新nuget
打开nuget.config并添加
,这是您的nuget.config应该是什么样子的示例

然后执行以下命令:

  • dotnet添加程序包链接任务-v 0.1.4-preview-981901
  • dotnet添加包Microsoft.Packaging.Tools.Trimming-v1.1.0-preview1-25818-01
  • dotnet发布-r win-x64-c发布/p:trimunseddependencies=true
使用这两个工具,我成功地将应用程序的大小除以三

资料来源:


我仍在尝试更好的优化。我想在一个只有10 MB的嵌入式系统中运行我的ASP.NET核心应用程序(目前为72 MB)

如果有人找到了更好的优化,我就是买家。

似乎比ILLinker更好

我在同一源代码上对.NET Core 2.2自包含输出进行的测试给出了:

  • 默认自包含发布:68 MB
  • ILLinker:36MB
  • iL编译器:5 MB

  • 自.NET Core 3.0以来,只需在项目的
    .csproj
    文件中添加一个标志即可:

    
    Exe
    netcoreapp3.0
    win-x64
    真的
    真的
    
    然后您可以使用
    dotnetpublish
    生成一个经过修剪的可执行文件

    这里有一个警告:

    重要的是考虑应用程序或框架(包括 ASP.NET内核和WPF)使用反射或相关动态功能, 修剪时会经常断裂。由于链接器 不知道这种动态行为,也无法确定 反射需要框架类型。IL链接器工具可以是 配置为了解此场景

    最重要的是,一定要在修剪后测试你的应用程序


    简单控制台应用程序的典型缩减结果似乎是从大约70MB减少到大约28MB

    旁注:如果您应该使用.net core 2.0,请使用
    win-x64
    而不是
    win10-x64
    谢谢。有道理。这是令人印象深刻的:-)部署大小减少了50%,正如页面所宣称的。非常有希望,但我不确定我是否可以将其用于生产用途。仍然让我感到困惑的是,我需要32MB的内存来制作一个简单的应用程序,它可以与stdin/stdout接口,与newtonsoft接口,与Serilog输出日志。Python中类似的应用程序被冻结为10MB。我相信这可能是苹果和橙子的比较。我将密切关注这个链接器的进展,因为它可能对micro至关重要-services@PeterMortensen你说得对。随着情况的变化,这样的答案很难回答。