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

Posted

技术标签:

【中文标题】在 .NET Core RC2 中构建 .exe 文件【英文标题】:Build .exe file in .NET Core RC2 【发布时间】:2016-09-20 07:44:38 【问题描述】:

每次我使用新的 .NET Core RC2 模板构建项目时,我没有获得可运行的 .EXE 文件。如果我按 F5 来调试我的控制台应用程序,它可以通过

C:\Program Files\dotnet\dotnet.exe 

应用程序。如果我使用

dotnet run 

文件夹中的命令,它也运行良好。但我认为没有 .NET Core CLI 工具就无法运行该应用程序。

我的内容

 bin\Debug\netcoreapp1.0\

文件夹如下所示:

如您所见,没有可用的 .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 使用 compilationOptions 的答案在 RC2 中已弃用。无论如何我都试过了,结果是一样的。 你是对的,对此感到抱歉。它应该是 buildOptions 并且您已经拥有 "emitEntryPoint": true 应该可以解决问题。您是否尝试从 cmd 行窗口手动运行dotnet build?另外,您确定您正在查看正确的输出目录吗? @DavidPine 是的,我尝试了构建、运行和发布命令。他们都工作正常。我只是在我的 bin 文件夹或任何底层文件夹中都没有 .exe 文件。 你应该用“dotnet yourfile.dll”运行netcoreapp1.0,我猜。好吧,这对我来说在 Windows 和 WSL 上都很好用。 【参考方案1】:

.NET Core 中实际上有 2 个应用模型:

便携式应用程序:深受“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":  
  

【讨论】:

就是这样!谢谢! 您能解释一下netcoreapp1.0 框架部分是否是必需的吗?也就是说,您已将 System.Net.Ping 列为依赖项 - 是否可以将其移至先前定义的 dependencies 部分? 这些应用程序模型都不会生成单个 .exe - 我猜这只有在完整的 .NET Framework 上才有可能? @romkyns 单个 .exe?你的意思是没有任何.dll? @Pinpoint - 很好的解释。您指向 MS 文档的链接也列出了 Linux 运行时(例如 debian.8-x64)。它们可以构建为独立的应用程序吗?【参考方案2】:

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

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

    依赖于框架的部署 独立部署

对于可运行的 .EXE 文件,应使用 Publish self-contained

【讨论】:

【参考方案3】:

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

dotnet publish --runtime win7-x64

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

如果您使用默认配置(New Project -> Console App (.NET Core)),则无需修改任何配置文件。

【讨论】:

【参考方案4】:

第 1 步:从 frameworks 部分下的 Project.json 中删除 "type": "platform",

第 2 步:将运行时部分添加到您的 project.json。请注意,每个部分都用逗号分隔。添加您的运行时。以下只是 win 10 的示例。

"runtimes": 
       "win10-x64":       
     

第 3 步:对您的项目执行 dotnet restore 命令。 (打开cmd,在src文件夹所在的地方进入你的项目文件夹,运行dotnet restore)

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

第五步:你可以看到在debug/netcore/win10/下创建的.exe

【讨论】:

【参考方案5】:

ASP.NET Core 中尝试将您的应用程序type 更改为default,在project.json 中:

"Microsoft.NETCore.App": 
  "type": "default",
  "version": "1.0.0-*"

【讨论】:

以上是关于在 .NET Core RC2 中构建 .exe 文件的主要内容,如果未能解决你的问题,请参考以下文章

UWP 应用程序和 .NET Core RC2:无法引用 netstandard1.4 包

ASP.NET Core -- 安装版

如何使用 ASP.NET Core RC2 MVC6 和 IIS7 获取当前 Windows 用户

dotnet跨平台微软昨天宣布正式发布.NET Core RC2和.NET Core SDK Preview 1,还有Entity Framework Core RC2

在 asp.net core rc2 中指定代理

如何在 ASP.NET core rc2 中禁用浏览器缓存?