.net core 使用Visual Studio 2017将.NET核心应用程序编译为EXE文件

.net core 使用Visual Studio 2017将.NET核心应用程序编译为EXE文件,.net-core,visual-studio-2017,.net Core,Visual Studio 2017,我在Visual Studio 2017中创建了一个.NET核心应用程序(v1.1)。当我编译它时,我会得到一个DLL文件,而不是生成项目的预期EXE文件。我检查了csproj文件,确认输出类型设置为exe,但没有骰子 为什么Visual Studio 2017仍在生成DLL文件 我肯定这是一个快速设置的地方,我忘了 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputT

我在Visual Studio 2017中创建了一个.NET核心应用程序(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>

Exe
netcoreapp1.1
任意CPU

2019年更新:

.NET Core 3.0+项目现在将包括默认情况下构建平台的可执行文件。这只是一个垫片可执行文件,您的主要逻辑仍然在
.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核心应用程序应该是
.dll
文件
OutputType
设置为
Exe
在本例中表示“可执行”,并执行所有必要操作以确保输出可运行(来自
Main()
方法,
.runtimeconfig.json
文件的入口点)。生成的DLL文件将使用以下方式运行:

dotnet yourapp.dll
此DLL文件可跨.NET核心运行时(Windows、Linux和macOS)支持的所有平台工作。这称为“可移植”或“依赖于框架”的部署

如果你真的想要一个<代码> .exe 文件,考虑自包含的部署。这将创建一个输出,其中包含自己的.NET核心运行时副本和一个

yourapp.exe
文件,但它也会增加已发布应用程序的大小,并且需要在发布新版本的运行时对其进行更新

此外,生成的应用程序仅在为发布的操作系统上工作


有关部署选项以及如何设置它们的更多详细信息,请参阅。

在Visual Studio 2017中:

  • 右键单击项目并选择“发布”(在VisualStudio2019中,单击菜单“构建”)→ (出版)
  • 选择“文件夹”并创建新的配置文件
  • 在“发布”选项卡中,单击“配置…”
  • 选择部署模式:自包含,目标运行时:win-x86(或win-x64)
  • 拯救
  • 发表
  • 在文件夹\bin\Debug\netcoreapp2.1\win-x86\中,您将看到EXE文件:


    其他答案都很好,但我发现有时方便的是:

    • 由于目标计算机可能安装了正确版本的.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.dll参数
    而不是
    dotnet yourapp.dll参数


    请注意,这个答案的上下文是内部工具,因此所有使用该工具的开发人员都有一个相当标准的开发机器设置。如果要将其分发给正在运行的外部客户,而该客户知道他们的设备上有什么,则自包含选项的优越性要高得多。

    这就是在任何操作系统中使用命令行进行自包含发布的方式:

    dotnet publish C:\src\App\App.csproj -c release -r win-x64 -o output-win-x64
    
    此外,您可能希望通过使用ILLink将输出从一个简单的Hello World应用程序的典型~60 MB减少到~30 MB


    此外,您可能希望更进一步,获得一个大小约为5MB的.exe文件,并使用ILCompiler

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


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

    幸运的是,.NET Core 2.2支持构建所谓的依赖于框架的可执行文件,这些文件本质上是围绕标准dll-s的包装二进制文件(.exe)

    这样您就拥有了标准的依赖于框架的部署的所有优点(和缺点)(同样,请参见Martin的回答),但是您有一种方便的方法来启动它,而无需通过dotnet CLI调用它

    您可以使用以下语法将应用发布为依赖于框架的可执行文件:

    dotnet publish -c Release -r <RID> --self-contained false
    
    dotnet publish-c Release-r--自包含的false
    

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

    感谢您提供有关不同部署策略的信息。这有助于我对.net core的理解。@Martin,我一生都在寻找“-p:PublishSingleFile=True”标志(1个月:)。谢天谢地,我是从3.0开始我的dotnetcore生活的,这在OSX Mojave、Linux(CentOS 7.6)和Windows 10上非常有效。谢谢!很高兴知道在VisualStudio中有一种方法可以做到这一点。值得一提的是,ILCompiler是一个类似CoreRT的AOT编译器平台,它有自己的限制(无反射、发射等)。