VS2017将NetCoreApp编译为EXE

时间:2017-05-18 04:53:52

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

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

为什么VS2017还在制作DLL?我确定它在某个地方快速设置,我忘记了...它也是凌晨1点。 :)

<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>

5 个答案:

答案 0 :(得分:69)

.NET Core应用程序应该是.dll个文件。在这种情况下,OutputType设置为Exe表示“可执行”,并执行确保输出可运行所需的一切(来自Main()方法,.runtimeconfig.json文件的入口点)。生成的dll文件应使用以下命令运行:

dotnet yourapp.dll 

此dll文件适用于.net核心运行时(windows,linux,macOS)支持的所有平台。这称为“可移植”或“框架相关”部署。

如果您真的需要.exe文件,请考虑自包含部署。这将创建一个包含其自己的.net核心运行时副本和yourapp.exe文件的输出 - 但它也会增加已发布应用程序的大小,并且需要在发布新版本的运行时时更新它。 此外,生成的应用程序仅适用于为其发布的操作系统。

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

答案 1 :(得分:40)

在VS2017中

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

在文件夹\ bin \ Debug \ netcoreapp2.1 \ win-x86 \中,您将看到EXE文件

Publish settings

答案 2 :(得分:1)

这就是您在任何操作系统中使用命令行进行独立发布的方式: dotnet发布C:\ src \ App \ App.csproj -c版本-r win-x64 -o output-win-x64

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

此外,您可能想更进一步,获得一个大小约为5Mb的.exe文件,并使用 ILCompiler See this reply

答案 3 :(得分:1)

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

尽管构建自包含部署可以是一个很好的解决方案,但它也有其自身的缺点。 (请参阅R.Titov和Martin Ullrichs在SCD-s上的回答。)

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

通过这种方式,您具有标准框架相关部署的所有优点(和缺点)(再次参见Martin的回答),但是您有一种方便的启动方式,而不必通过 dotnet CLI进行调用。

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

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

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

答案 4 :(得分:0)

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

  • 不具有独立性,因为目标计算机可能已安装了正确版本的.net核心。这样可以减少我需要运送的dll的数量。
  • 不必在命令行上指定dotnet

为此,可以使用类似于以下行的蝙蝠文件包装器:

@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结尾,请命名蝙蝠文件yourapp.bat并将其放置在dll旁边。现在,您可以致电dotnet yourapp.dll params

来代替yourapp params

请注意,此答案的上下文是内部工具,因此使用该实用程序的所有开发人员都将拥有相当标准的开发机设置。如果要将这些信息分发给知道他们的包装盒的外部运行客户,则自包含的选项要好得多。