C#.NET标准1.6,在已发布的应用程序

时间:2017-03-31 13:41:46

标签: c# .net .net-core

我正在尝试使用Visual Studio 2017和.NET Core,这是我几年来第一次尝试使用C#/ .NET(从Golang返回)。我试图创建一个小型的hello world style网络应用程序,它只是监听和回应来自tcp客户端的输入:

using System;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;

namespace TaskSockets
{
    class Program
    {

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            TcpListener server = new TcpListener(IPAddress.Any, 5555);
            server.Start();

            while (true)
            {
                TcpClient newClient = server.AcceptTcpClientAsync().Result;

                Task.Run(async () => {

                    StreamWriter sWriter = new StreamWriter(newClient.GetStream(), Encoding.ASCII);
                    StreamReader sReader = new StreamReader(newClient.GetStream(), Encoding.ASCII);

                    Boolean bClientConnected = true;
                    String sData = null;

                    while (bClientConnected)
                    {
                        sData = await sReader.ReadLineAsync();

                        Console.WriteLine("Client: " + sData);
                    }
                });
            }

        }
    }
}

我的项目/构建配置如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netstandard1.6</TargetFramework>
    <RuntimeIdentifiers>win7-x64</RuntimeIdentifiers>
  </PropertyGroup>
  <ItemGroup>
     <PackageReference Include="Microsoft.NETCore.Runtime.CoreCLR" Version="1.1.1" />
     <PackageReference Include="Microsoft.NETCore.DotNetHostPolicy" Version="1.1.0" />
   </ItemGroup>

</Project>

发布应用程序(dotnet发布)后,我得到一个包含我需要的可执行文件的文件夹。然而,我遇到的问题是该文件夹包含205个文件(主要是与.NET相关的DLL文件)并且大小超过30 MB。这包括参考我甚至不使用的.NET库的dll文件,例如System.Xml和Linq。

有没有办法减少已发布应用程序的文件数量和大小,以便包含我需要的内容?

更新: 试图使用dotnet工具而不是visual studio从头开始重新创建项目:

  

dotnet new console --language C#--name Socket --output Socket   --framework netcoreapp1.0

这创建了这个项目(由于某种原因,尽管有exe输出类型和控制台应用程序目标,它仍会编译成一个dll):

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.0</TargetFramework>
  </PropertyGroup>
</Project>

然后手动修改csproj文件,使其如下所示:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.0</TargetFramework>
    <RuntimeIdentifiers>win7-x64</RuntimeIdentifiers>
  </PropertyGroup>
  <ItemGroup>
     <PackageReference Include="Microsoft.NETCore.Runtime.CoreCLR" Version="1.0.6" />
   </ItemGroup>
</Project>

现在发布:

  

dotnet publish --runtime win7-x64 --configuration Release

转到:

  

./仓/释放/ netcoreapp1.0 / WIN7-64

现在突然有一个工作的exe文件和一些大小约为1 MB的DLL文件。通过删除名为“发布”的子文件夹,我现在可以使用一些没有大部分膨胀的东西。不知道为什么这样做,以及它是否考虑了预期的行为。不知道发布文件夹是什么,或者是否需要在没有安装.NET的计算机上进行部署。微软在其文档方面还有一些工作要做。

1 个答案:

答案 0 :(得分:2)

查看https://docs.microsoft.com/en-us/dotnet/articles/core/deploying/index

在第一种情况下,您的cc_test命令会生成publish的输出,该输出依赖于目标计算机上.NET Core框架的存在。您的代码(以dll(s)的形式)将由运行时执行。

在第二种情况下,当您使用Framework-dependent deployment选项指定目标运行时时,--runtime会生成publish的输出,其中使用的.NET Core框架版本为< EM>包括。有一种方法可以减少输出的总大小,如Self-contained deployment部分中的上述文章中所述。

至于为什么Deploying a self-contained deployment with a smaller footprint没有生成<OutputType>Exe</OutputType>文件,请查看https://docs.microsoft.com/en-us/dotnet/articles/core/tools/dotnet-build

它基本上表示生成的

  

二进制文件包括项目中间语言(IL)的代码   扩展名为.dll的文件

以及指定和不指定exe

之间的区别
  

是库的IL DLL不包含入口点和   无法执行。