【问题标题】:Compile a .NET Core application as an EXE file using Visual Studio 2017使用 Visual Studio 2017 将 .NET Core 应用程序编译为 EXE 文件
【发布时间】:2017-05-18 04:53:52
【问题描述】:

我在 Visual Studio 2017 中创建了一个 .NET Core 应用程序 (v1.1)。当我编译它时,我得到了一个 DLL 文件,而不是所构建项目的预期 EXE 文件。我确实检查了csproj 文件并确认输出类型设置为exe,但没有骰子。

为什么 Visual Studio 2017 仍在生成 DLL 文件?

我确定这是我忘记的某个地方的快速设置...

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>AnyCPU</PlatformTarget>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Core.EF.SqlServer\Core.EF.SqlServer.csproj" />
  </ItemGroup>

</Project>

【问题讨论】:

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


    【解决方案1】:

    2019 年更新:

    .NET Core 3.0+ 项目现在将包含一个适用于您在默认情况下构建的平台的可执行文件。这只是一个 shim 可执行文件,您的主要逻辑仍在 .dll 文件中。

    但 .NET Core 3.0 也引入了单文件部署,因此部署时使用

    dotnet publish -r win-x64 -p:PublishSingleFile=True --self-contained false
    

    将创建一个包含所有依赖项的单个 .exe 文件。您可以将 --self-contained 更改为 true 以同时包含 .NET Core 运行时,因此无需在目标计算机上全局安装 .NET Core。

    原创

    .NET Core 应用程序应该是.dllfiles。 OutputType 设置为 Exe 在这种情况下意味着“可执行”,并执行所有必要的操作以确保输出可运行(来自 Main() 方法的入口点,.runtimeconfig.json 文件)。生成的 DLL 文件应使用以下命令运行:

    dotnet yourapp.dll
    

    此 DLL 文件适用于 .NET Core 运行时支持的所有平台(Windows、Linux 和 macOS)。这称为“便携式”或“依赖于框架”的部署。

    如果您真的想要一个 .exe 文件,请考虑自包含部署。这将创建一个包含其自己的 .NET Core 运行时副本和yourapp.exe 文件的输出 - 但它也会增加已发布应用程序的大小,并且需要在新版本的运行时发布时进行更新。

    此外,生成的应用程序仅适用于为其发布的操作系统。

    请参阅 .NET Core application deployment,了解有关部署选项以及如何设置它们的更多详细信息。

    【讨论】:

    • 感谢您提供有关不同部署策略的信息。这有助于我更多地理解 .net-core。
    • @Martin,我一生都在 dotnetcore 中寻找“-p:PublishSingleFile=True”标志(1 个月 :))。谢天谢地,我从 3.0 开始我的 dotnetcore 生活,这在 OSX Mojave、Linux (CentOS 7.6) 和 Windows 10 上运行良好。
    【解决方案2】:

    在 Visual Studio 2017 中:

    1. 右键单击您的项目并选择发布(在 Visual Studio 2019 中,单击菜单 BuildPublish
    2. 选择“文件夹”并创建新配置文件
    3. 在“发布”选项卡中,单击“配置...”
    4. 选择部署模式:独立,目标运行时:win-x86(或win-x64)
    5. 保存
    6. 发布

    在文件夹\bin\Debug\netcoreapp2.1\win-x86\你会看到EXE文件:

    【讨论】:

    • 谢谢!很高兴知道在 Visual Studio 中有一种方法可以做到这一点。
    • 在 Visual Studio 2019 中,此配置文件设置对话框中有一个“文件发布选项”部分。单击它展开它,然后确保选中“生成单个文件”。
    【解决方案3】:

    从 .NET Core 2.2 开始,您可以构建框架相关的可执行文件


    虽然构建自包含部署可能是一个很好的解决方案,但它也有其自身的缺点。 (参见 R.Titov 和 Martin Ullrichs 对 SCD-s 的回答。)

    幸运的是,.NET Core 2.2 支持构建所谓的框架相关的可执行文件-s,它本质上是一个包装二进制文件(Windows 上的.exe ) 围绕标准 dll-s

    这种方式您拥有标准框架相关部署的所有优点(和缺点)(再次参见 Martin 的回答),但 您有一种方便的方式来启动它 strong>,无需通过 dotnet CLI 调用它。

    您可以使用以下语法将您的应用发布为框架相关的可执行文件

    dotnet publish -c Release -r <RID> --self-contained false
    

    其中 RID 是通常的运行时标识符,例如win-x64 或您希望为其构建的任何平台 (see the catalog here)。

    【讨论】:

      【解决方案4】:

      这就是您在任何操作系统中使用命令行进行独立发布的方式:

      dotnet publish C:\src\App\App.csproj -c release -r win-x64 -o output-win-x64
      

      此外,您可能希望通过使用 ILLink 将输出从简单的 Hello World 应用的典型约 60 MB 减少到约 30 MB。

      此外,您可能还想获得一个大小约为 5 MB 的单个 .exe 文件并使用 ILCompilerSee this reply.

      【讨论】:

      • 值得一提的是ILCompiler是像CoreRT一样的AOT编译器平台,它有自己的局限性(没有Reflection.Emit等)。
      【解决方案5】:

      其他答案很好,但我觉得有时方便的是:

      • 没有独立,因为目标计算机可能安装了正确版本的 .NET Core。这减少了我需要发送的 DLL 文件的数量。
      • 不必在命令行中指定dotnet

      为此,可以使用 bat 文件包装器,类似于以下几行:

      @ECHO OFF
      REM see http://joshua.poehls.me/powershell-batch-file-wrapper/
      
      SET SCRIPTNAME=%~d0%~p0%~n0.dll
      SET ARGS=%*
      
      dotnet "%SCRIPTNAME%" %ARGS%
      EXIT /B %ERRORLEVEL%
      

      如果您的应用程序以 yourapp.dll 结尾,请将 bat 文件命名为 yourapp.bat 并将其放在 DLL 文件旁边。现在你可以打电话给yourapp params,而不是dotnet yourapp.dll params

      请注意,此答案的上下文是内部工具,因此所有使用该实用程序的开发人员都将拥有非常标准的开发机器设置。如果要将其分发给正在运行的外部客户,他们知道他们的盒子上有什么,那么自包含选项要好得多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 2019-11-09
        • 2019-11-29
        • 2019-05-04
        相关资源
        最近更新 更多