控制台应用程序 DLL 和 Class 库 DLL 之间的区别

Difference between Console Application DLL and Class Library DLL

在 Rider 中,制作一个简单的 Hello World 控制台项目后,我可以在两种输出类型中选择一种:控制台应用程序和 Class 库。前者制作一个可运行的exe和一个可运行的DLL,而后者制作一个不可运行的DLL。可运行的DLL显然需要通过dotnet CLI驱动运行

区分前者和后者 DLL 的正确术语是什么?除了一个可以运行而一个不能运行之外,我不确定有什么区别。

另外,为什么可运行的 DLL 比 exe 小 30 倍?

与您的偏好 IDE 无关,即。即使使用 dotnet new console -n myapp 从 CLI 执行此操作,然后 运行 宁 dotnet build 也会(现在使用 .NET6)生成一个 myapp\bin\debug\net6.0 目录,您可以在其中获得一个 平台特定的execross-platfrom dll.

该 exe 是您的应用程序的特定平台(OS/CPU arch)可执行文件,包含您的 OS/platform 所需的所有内容(这是您询问的 30 倍重量,不确定其中真正的内容) 而另一方面,如果 运行 通过 .NET 运行时(即 dotnet myapp.dll),dll 将在任何平台上运行。

您可以 运行 直接调用 .exe(在您当前的 OS/CPU arch 上):.\myapp.exe

您可以 运行 在任何装有 .NET Runtime 的机器上安装 .dll(如您所说的 驱动程序 )(在您构建的相同版本中)与 dotnet 一起安装路径变量中的 CLI 为:dotnet myapp.dll.

前一个 dll 是您的应用程序的 cross-platform 二进制文件,可以使用适当的 .NET 运行时执行,后者是一个 .NET 库 dll,它不是 <OutputType>Exe<OutputType>(而是库)并且不打算执行(其中某处没有 Main())但打算被其他 DLL(或项目,如您所愿)引用。

在此处阅读有关平台特定 exe 的更多信息:https://docs.microsoft.com/en-us/dotnet/core/deploying/#produce-an-executable

您可以在此处阅读有关发布 exe 的更多信息:https://docs.microsoft.com/en-us/dotnet/core/deploying/#publish-framework-dependent

.csproj 项目文件中的 <OutputType>Exe</OutputType> 强制执行 exe 输出。

此外,您可以考虑了解 Single-File-Executables(此处:https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file/overview),您甚至可以在其中打包 .NET 运行时,因此您的目标机器甚至不需要 dotnet(在路径变量中)。