构建.NET Core控制台应用程序以输出EXE?

时间:2017-05-19 15:43:37

标签: .net-core

对于面向.NET Core 1.0的控制台应用程序项目,我无法弄清楚如何在构建期间输出.exe。项目在调试中运行良好。

我已尝试发布该项目,但这也不起作用。有道理,因为.exe将是特定于平台的,但必须有一种方法。我的搜索仅引用了使用project.json的旧.Net Core版本。

无论何时我建立或发布,这都是我得到的。

build directory

5 个答案:

答案 0 :(得分:356)

出于调试目的,您可以使用dll文件。您可以使用PYTHONPATH运行它。如果要生成exe,则必须生成一个自包含的应用程序。

要生成自包含的应用程序(在Windows中为exe),您必须指定目标运行时(特定于您定位的操作系统)。

仅限Pre-.NET Core 2.0 :首先,在csproj(list of supported rid)中添加目标运行时的运行时标识符:

dotnet ConsoleApp2.dll

从.NET Core 2.0 开始,不再需要执行上述步骤。

然后,在发布应用程序时设置所需的运行时:

<PropertyGroup>
    <RuntimeIdentifiers>win10-x64;ubuntu.16.10-x64</RuntimeIdentifiers>
</PropertyGroup>

答案 1 :(得分:18)

对于正在使用Visual Studio并希望通过GUI进行操作的任何人,请参见以下步骤:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

答案 2 :(得分:11)

以下内容将在输出目录中产生

  • 所有包装参考
  • 输出程序集
  • 自举程序

但不包含所有netcore运行时程序集

<PropertyGroup>
  <Temp>$(SolutionDir)\packaging\</Temp>
</PropertyGroup>

<ItemGroup>
  <BootStrapFiles Include="$(Temp)hostpolicy.dll;$(Temp)$(ProjectName).exe;$(Temp)hostfxr.dll;"/>
</ItemGroup>

<Target Name="GenerateNetcoreExe"
        AfterTargets="Build"
        Condition="'$(IsNestedBuild)' != 'true'">
  <RemoveDir Directories="$(Temp)" />
  <Exec
    ConsoleToMSBuild="true"
    Command="dotnet build $(ProjectPath) -r win-x64 /p:CopyLocalLockFileAssemblies=false;IsNestedBuild=true --output $(Temp)" >
    <Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
  </Exec>
  <Copy
    SourceFiles="@(BootStrapFiles)"
    DestinationFolder="$(OutputPath)"
  />

</Target>

我在https://github.com/SimonCropp/NetCoreConsole

中将其包装在一个示例中

答案 3 :(得分:1)

如果可接受.bat文件,则可以创建与dll名称相同的bat文件(并将其放置在同一文件夹中),然后粘贴以下内容:

dotnet %0.dll %*

显然,这是假定计算机已安装.NET Core。

不带'.bat'部分调用它。即:c:\>"path\to\program" -args blah (此答案来自Chet的评论)

答案 4 :(得分:0)

这是我的解决方法-生成一个控制台应用程序(.NET Framework),该应用程序读取其自己的名称和参数,然后调用dotnet [nameOfExe].dll [args]

当然,这是假设目标计算机上已安装dotnet。

这是代码,随时可以复制!

using System;
using System.Diagnostics;
using System.Text;

namespace dotNetLauncher
{
    class Program
    {
        /*
            If you make .net core apps, they have to be launched like dotnet blah.dll args here
            This is a convenience exe that launches .net core apps via name.exe
            Just rename the output exe to the name of the .net core dll you wish to launch
        */
        static void Main(string[] args)
        {
            var exePath = AppDomain.CurrentDomain.BaseDirectory;
            var exeName = AppDomain.CurrentDomain.FriendlyName;
            var assemblyName = exeName.Substring(0, exeName.Length - 4);
            StringBuilder passInArgs = new StringBuilder();
            foreach(var arg in args)
            {
                bool needsSurroundingQuotes = false;
                if (arg.Contains(" ") || arg.Contains("\""))
                {
                    passInArgs.Append("\"");
                    needsSurroundingQuotes = true;
                }
                passInArgs.Append(arg.Replace("\"","\"\""));
                if (needsSurroundingQuotes)
                {
                    passInArgs.Append("\"");
                }

                passInArgs.Append(" ");
            }
            string callingArgs = $"\"{exePath}{assemblyName}.dll\" {passInArgs.ToString().Trim()}";

            var p = new Process
            {
                StartInfo = new ProcessStartInfo("dotnet", callingArgs)
                {
                    UseShellExecute = false
                }
            };

            p.Start();
            p.WaitForExit();
        }
    }
}