我正在尝试使用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的计算机上进行部署。微软在其文档方面还有一些工作要做。
答案 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不包含入口点和 无法执行。