将.Net Core构建为EXE而不是DLL

19

我想将.NET Core项目构建为EXE而不是DLL,以便可以执行。

这里的答案没有起作用:如何运行.NET Core dll?

这是示例代码:

using System;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

这是我的project.json文件:

{
  "version": "1.0.0-*",
  "compilationOptions": {
    "emitEntryPoint": true
  },
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {},
  "frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "type": "platform",
          "version": "1.1.0"
        }
      },
      "imports": "dnxcore50"
    }
  }
}

我目前正在使用VSCode,每当我使用构建任务构建项目或运行dotnet restore时,我只会在我的bin/Debug文件夹中得到一个.dll文件。

如何将.NET Core应用程序构建为exe文件?

奖励问题:如果我这样做了,它能在Mac或其他设备上运行吗?


Scott Hanselman写了一篇博客,可能会回答这个确切的问题。 - Mark C.
@MarkC,那个很好用,但现在已经破坏了构建和通过VSCode进行调试 :/ - Douglas Gaskell
这个问题目前可能有最好的答案: https://dev59.com/Ma3la4cB1Zd3GeqPKUgs - Norman H
3个回答

8

我认为大多数人来到这个页面是因为他们选择了 .net core 并且无法从他们的 VS 2017/VS 2019 构建中获得可执行的 .exe 文件。VS 2015 总是会为控制台应用程序生成一个 .exe 文件。但是在 VS 2017/VS 2019 中,当你创建项目时,你有两个选项可以选择 Console 应用程序,一个是 Console App (.NET Core),另一个是 Console App (.NET Framework)。如果你选择 .NET Core 选项,你将不得不费尽心思才能从 Build 中获取 .exe 文件。(.NET Core) 选项会从 Build 中创建一个 .dll 文件。如果你选择了 (.NET Framework) 选项,则它默认会构建一个 xxxx.exe 可执行文件。


1
或者您可以在您的csproj文件中指定“OutputType”并将其设置为“Exe”。 - ColinM
8
Colin,感谢你的建议,同意如果它奏效那将是一个简单的修复。在使用VS 2017企业版时,我创建了一个(.NET Core)控制台应用程序。在创建时,csproj文件中输出类型显示为Exe,而不是我们可能期望的"dll",当我去查看bin/...目录时,只有一个.dll文件,没有.exe文件。 - renaissanceMan

7
要生成EXE而不是DLL,您需要进行自包含部署。您当前所做的是依赖于框架的部署。 要将其转换为自包含,请在project.json文件中执行以下步骤。
  1. 删除"type":"platform"。
  2. 添加一个"runtimes"部分,用于支持您的应用程序的操作系统。
构建时,请传递目标操作系统。例如,dotnet build -r osx.10.10-x64。
这是最终的project.json文件。
{
  "version": "1.0.0-*",
  "compilationOptions": {
    "emitEntryPoint": true
  },
  "buildOptions": {
    "debugType": "portable",
    "emitEntryPoint": true
  },
  "dependencies": {},
  "frameworks": {
    "netcoreapp1.1": {
      "dependencies": {
        "Microsoft.NETCore.App": {
          "version": "1.1.0"
        }
      },
      "imports": "dnxcore50"
    }
  },
  "runtimes": {
    "win10-x64": {},
    "osx.10.10-x64": {}
  }
}

参见:https://learn.microsoft.com/en-us/dotnet/articles/core/deploying/#self-contained-deployments-scd

7
截至2017年3月,项目.json已被弃用,取而代之的是.csproj文件。更多信息可以在这里找到:https://learn.microsoft.com/zh-cn/dotnet/core/tools/project-json-to-csproj 。根据此页面,运行时元素现在为:<PropertyGroup><RuntimeIdentifiers>win7-x64;osx.10.11-x64;ubuntu.16.04-x64</RuntimeIdentifiers></PropertyGroup>。 - arichards

0

接受的答案指出:

要生成一个EXE而不是DLL,您需要一个自包含的部署。

然而,在发布应用程序时,您可以生成一个可执行文件,同时将其作为框架依赖项。在.NET应用程序发布概述-生成可执行文件中:

可执行文件不是跨平台的,它们特定于操作系统和CPU架构。在发布应用程序并创建可执行文件时,您可以将应用程序发布为自包含或框架依赖项。将应用程序发布为自包含包括了.NET运行时和应用程序,应用程序的用户在运行应用程序之前不必担心安装.NET。将应用程序发布为框架依赖项不包括.NET运行时,只包括应用程序和第三方依赖项。

例如,这些MSBuild属性将生成适用于Linux x64的本机可执行文件和DLL:

<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
<SelfContained>false</SelfContained>
<TargetType>exe</TargetType>

注意:虽然dll文件是跨平台的,但使用这些选项生成的dll文件不能保证在指定以外的不同操作系统上运行。这是因为如.NET应用程序发布概述-特定于平台和依赖于框架中所述:

如果应用程序使用了一个具有特定于平台实现的NuGet包,那么只会复制目标平台的依赖项。这些依赖项直接复制到发布文件夹中。

虽然从技术上讲,生成的二进制文件是跨平台的,但通过针对特定平台进行目标定位,不能保证您的应用程序在跨平台上运行。您可以运行dotnet <filename.dll>,但是当应用程序尝试访问缺失的特定于平台的依赖项时,应用程序可能会崩溃。

您可以通过在Linux上运行以下命令来验证:

  • cat /proc/<executable-pid>/maps
  • lsof -p <executable-pid>

输出将显示从/usr/share/dotnet/shared加载的许多Microsoft dll文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接