在.NET Core RC2中构建.exe文件

79
使用新的.NET Core RC2模板构建项目时,每次我都没有提供可运行的.EXE文件。如果我按F5调试控制台应用程序,则会正常运行。
C:\Program Files\dotnet\dotnet.exe 

应用程序。如果我使用

dotnet run 

在该文件夹中运行命令也能正常运行。但我发现没有.NET Core CLI工具就无法运行该应用程序。

我的文件夹内容

 bin\Debug\netcoreapp1.0\

文件夹看起来像这样:

Bin folder structure

可以看到没有可用的.EXE文件,只有dll。

我是否忽略了什么?还是我的project.json文件存在问题?

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.0-rc2-3002702"
    }
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "dnxcore50"
    }
  }
}

谢谢!


@DavidPine 在RC2中使用compilationOptions的答案已经过时。我还是尝试了一下,但结果仍然相同。 - Johannes Heesterman
你是对的,很抱歉。应该是 buildOptions,而且你已经有了 "emitEntryPoint": true,这应该可以解决问题。你尝试过从 cmd 窗口手动运行 dotnet build 吗?另外,你确定你正在查看正确的输出目录吗? - David Pine
@DavidPine,是的,我尝试了构建、运行和发布命令。它们都很好用。但是我在我的 bin 文件夹或任何底层文件夹中都没有得到 .exe 文件。 - Johannes Heesterman
你应该使用命令 "dotnet yourfile.dll" 运行 netcoreapp1.0,我猜测。这在 Windows 和 WSL 上对我来说都完美地运行了。 - Felype
5个回答

72

实际上,在 .NET Core 中有两种应用程序模型:

  • 可移植应用程序:受“DNX控制台应用程序”的启发,这些应用程序不会生成.exe文件,而是由.NET Core共享运行时执行(其版本由Microsoft.NETCore.App包定义,感谢其特殊的type: platform属性)。相应的.NET Core运行时必须安装在计算机上才能使用可移植应用程序。如果找不到确切的版本,则在运行dotnet run时会抛出异常。

  • 独立应用程序:独立应用程序与旧版.NET控制台应用程序非常相似,因为它们会生成.exe文件。.NET Core运行时不需要安装在计算机上,因为它直接嵌入到应用程序本身中。

您当前正在使用第一种模型。要使用独立模型,您需要调整project.json

  • 添加一个runtimes部分以列出您的应用程序将针对的环境(例如win7-x64ubuntu.14.04-x64)。您可以在此处找到完整的列表here
  • 删除Microsoft.NETCore.App依赖项。您可以将其替换为此包:"NETStandard.Library": "1.5.0-rc2-24027"

下面是一个独立应用程序的示例:

{
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "warningsAsErrors": true
  },

  "dependencies": {
    "Microsoft.Extensions.Configuration.Binder": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.CommandLine": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
    "Microsoft.Extensions.DependencyInjection": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final",
    "NETStandard.Library": "1.5.0-rc2-24027"
  },

  "frameworks": {
    "net451": { },

    "netcoreapp1.0": {
      "dependencies": {
        "System.Net.Ping": "4.0.0-rc2-24027"
      },

      "imports": [
        "dnxcore50",
        "dotnet5.6",
        "portable-net451+win8"
      ]
    }
  },

  "runtimes": {
    "win7-x64": { }
  }
}

2
就是这样!谢谢! - Johannes Heesterman
你能否解释一下 netcoreapp1.0 框架部分是否是必需的?那就是你已经将 System.Net.Ping 列为一个依赖项,它可以移动到之前定义的 dependencies 部分吗? - wal
3
这两种应用程序模型都不会生成单个的 .exe 文件,我猜这只有在完整的 .NET Framework 上才可能实现? - Roman Starkov
@Pinpoint - 解释得非常好。你提供的MS文档链接也列出了Linux运行时(例如debian.8-x64)。它们可以作为独立应用程序构建吗? - Alien Technology
为了将我的便携应用程序转换为独立应用程序,我只需在我的依赖项中注释掉“type”属性 - "dependencies": { "Microsoft.NETCore.App": { //"type": "platform", "version": "1.0.1" } }。它仍然对我有效。我不必像你建议的那样添加NetStandard.Library。它们是等效的吗? - RBT
显示剩余2条评论

13

答案在文档中,现在有完整的步骤。

您可以为.NET Core应用程序创建两种类型的部署:

  1. 基于框架的部署
  2. 独立部署

对于可运行的.EXE文件,应使用发布自包含


9

要从.NET Core控制台应用程序创建可运行的应用程序,您可以使用dotnet工具。只需在项目目录中运行:

dotnet publish --runtime win7-x64

这将创建一个独立的应用程序(自包含部署;包括在您的磁盘上至少消耗60MB的所有必要库)。当然,您也可以选择其他运行时,比如osx.10.11-x64ubuntu.16.04-x64

如果您使用了默认配置(新项目->控制台应用程序(.NET Core)),则不需要修改任何配置文件。


4

步骤一:从frameworks部分的Project.json文件中删除"type": "platform"

步骤二:将运行时部分添加到您的project.json文件中。请注意,每个部分之间用逗号分隔。在下面是Windows 10的示例:

"runtimes": {
       "win10-x64": {}      
     }

第三步:在您的项目上运行dotnet restore命令。(打开cmd,进入您的项目文件夹,无论src文件夹在哪里,运行dotnet restore)

第四步:dotnet pack 第四步:dotnet build -r win10-x64 - 或者只是构建。

第五步:您可以注意到在debug/netcore/win10/下创建了.exe文件。


2
在ASP.NET Core中,尝试将应用程序类型更改为"default",在"project.json"中:
"Microsoft.NETCore.App": {
  "type": "default",
  "version": "1.0.0-*"
}

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