【问题标题】:How can I build a Visual Studio 2017 .NET Core .exe file on a developer machine?如何在开发人员机器上构建 Visual Studio 2017 .NET Core .exe 文件?
【发布时间】:2017-03-18 10:34:40
【问题描述】:

请参阅下面的解决方案部分了解 TLDR。

我使用 Visual Studio 2015 社区版并升级到 Visual Studio 2017。我正在开发一个 .NET Core 控制台应用程序。 我在这里只谈论我的本地开发机器,它安装了 Visual Studio 并安装了 .NET Core 运行时和 SDK。

在 Visual Studio 2015 中,使用了 project.json 文件,默认情况下,构建过程会在 bin/Debug/netcoreapp1.1 中生成一个 DLL 文件,可以使用 dotnet run 命令运行该文件。但是有一个选项可以在 project.json 文件中进行微调:

...
"Microsoft.NETCore.App": {
  "version": "1.0.1",
  "type": "platform"
},
...

->

...
"Microsoft.NETCore.App": {
  "version": "1.0.1"
},
...

并添加一个runtimes 部分,例如

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

如果您这样做并构建了您的项目,则会创建一个 EXE 文件,您可以直接运行该文件,而无需使用 dotnet run

现在的问题是,在 Visual Studio 2017 中使用 .csproj XML 文件是否可以实现相同的操作?更具体地说,是否有可能没有大量的独立部署?我确实希望它没有完整的 SDD 发布,因为我在开发过程中将这些可执行文件仅用于本地测试。一旦项目要发布,我就做SDD发布,但是在开发过程中非常不方便。

该项目已转换为 Visual Studio 2017,但它只会再次生成 DLL 文件。因此,我尝试创建一个全新的空 Hello, World! 程序并尝试从中获取 EXE 文件。 Hello, World! csproj 文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
</Project>

这只会生成一个您可以使用dotnet run 运行的 DLL 文件。可以对此进行更改:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp1.1;net46</TargetFrameworks>
  </PropertyGroup>
</Project>

这非常接近我想要的 - 生成一个 EXE 文件。但是,这会创建运行 .NET Framework 4.6 而不是 .NET Core 的 EXE 文件。所以,它并不能解决问题。 我真正想要的是 .NET Core 可执行文件,而无需进行独立部署。有可能吗?

解决方案

我刚刚发现这确实是可能的。我只是不知道如何在IDE中做到这一点。如果我在 IDE 中按 Ctrl + Alt + F7 会产生与命令相同的结果:

dotnet build --configuration Debug

而我想要的可以通过命令产生:

dotnet build --configuration Debug --runtime win10-x64

所以我现在真正想要的是修改默认的 IDE 构建命令以使用 --runtime win10-x64 参数复制此行为。

【问题讨论】:

    标签: exe .net-core visual-studio-2017 csproj


    【解决方案1】:

    在 .NET Core 中,如果您想要在 dotnet build 期间生成 .exe,您需要提供您想要构建可执行文件的运行时。

    在 project.json 中,您通过删除 type: platform 并添加 runtimes 部分来完成上述操作。

    在 .csproj 中,您可以通过指定名为 RuntimeIdentifier 的 MSBuild 属性来实现。在命令行中,当您说 dotnet build --runtime win10-x64 时,--runtime 值被传递到 MSBuild 中,具有 RuntimeIdentifier 属性。

    一个选项是您可以在 .csproj 中纯粹设置 RuntimeIdentifier

    <PropertyGroup>
      <RuntimeIdentifier>win10-x64</RuntimeIdentifier>
    </PropertyGroup>
    

    现在,当您在 Visual Studio 中构建时,它会在构建输出文件夹中生成一个 .exe

    或者

    我不确定您是否对此感兴趣,但听起来您只是想要一种无需调用dotnet run 即可运行应用程序的方法。如果这是真的,您根本不需要设置运行时。默认情况下,您的应用程序会内置在 bin\Debug\netcoreapp1.1\AppName.dll 中。你可以通过说dotnet bin\Debug\netcoreapp1.1\AppName.dll 来运行你的应用程序,这基本上就是dotnet run 在幕后所做的。

    【讨论】:

    • 有效!发送很多。我只想补充一点,应该注意RuntimeIdentifier 的单数,因为似乎还有一个名为RuntimeIdentifiers 的分号分隔列表,它显然还有其他作用。
    • RuntimeIdentifiers 是您的项目可以定位的可用运行时列表。就像TargetFrameworks 是您的项目可以定位的可用框架列表。不同之处在于,当您构建时,它为所有目标框架构建,但它只为“运行时不可知”或“可移植”运行时构建它们。要为特定运行时构建/发布,您必须使用 RuntimeIdentifier MSBuild 属性(或 dotnet 命令行上的 --runtime)指定一个。
    猜你喜欢
    • 2017-08-08
    • 1970-01-01
    • 2018-03-03
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多