Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 生成.NET核心控制台应用程序以输出EXE_.net Core - Fatal编程技术网

.net core 生成.NET核心控制台应用程序以输出EXE

.net core 生成.NET核心控制台应用程序以输出EXE,.net-core,.net Core,对于以.NET Core 1.0为目标的控制台应用程序项目,我不知道如何在生成过程中获取.exe输出。该项目在调试中运行良好 我已经尝试过发布这个项目,但也不起作用。这是有意义的,因为EXE文件是特定于平台的,但必须有一种方法。我的搜索只找到了对使用project.json的旧.NET核心版本的引用 无论何时构建或发布,我得到的都是: 出于调试目的,您可以使用DLL文件。您可以使用dotnetconsoleapp2.dll运行它。如果要生成EXE文件,必须生成一个自包含的应用程序 要生成自包含应

对于以.NET Core 1.0为目标的控制台应用程序项目,我不知道如何在生成过程中获取.exe输出。该项目在调试中运行良好

我已经尝试过发布这个项目,但也不起作用。这是有意义的,因为EXE文件是特定于平台的,但必须有一种方法。我的搜索只找到了对使用project.json的旧.NET核心版本的引用

无论何时构建或发布,我得到的都是:


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

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

仅限.NET Core 2.0之前版本:首先,在.csproj文件()中添加目标运行时的运行时标识符:


win10-x64;ubuntu.16.10-x64
从.NET Core 2.0开始,不再需要执行上述步骤

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

dotnet publish -c Release -r win10-x64
dotnet publish -c Release -r ubuntu.16.10-x64

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

  • 所有的包引用
  • 输出组件
  • 引导exe
但它并不包含所有.NET核心运行时程序集


$(SolutionDir)\n打包\

我在这里的一个示例中总结了它:

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

当然,这假定.NET安装在目标计算机上

这是密码。请随意复制

使用系统;
使用系统诊断;
使用系统文本;
命名空间dotNetLauncher
{
班级计划
{
/*
如果您制作.NET核心应用程序,它们必须像这里的.NET blah.dll参数一样启动
这是一个方便的EXE文件,通过name.EXE启动.NET核心应用程序
只需将输出exe重命名为要启动的.NET核心DLL文件的名称
*/
静态void Main(字符串[]参数)
{
var exePath=AppDomain.CurrentDomain.BaseDirectory;
var exeName=AppDomain.CurrentDomain.FriendlyName;
var assemblyName=exeName.Substring(0,exeName.Length-4);
StringBuilder passInArgs=新StringBuilder();
foreach(args中的var arg)
{
bool needsErroringQuotes=false;
if(arg.Contains(“”)| arg.Contains(“”))
{
passinars.Append(“\”);
NeedsErroringQuotes=true;
}
Append(arg.Replace(“\”,“\”);
如果(需要箭头引号)
{
passinars.Append(“\”);
}
passinars.Append(“”);
}
字符串callingArgs=$“\”{exePath}{assemblyName}.dll\“{passinars.ToString().Trim()}”;
var p=新流程
{
StartInfo=newprocessstartinfo(“dotnet”,callingArgs)
{
UseShellExecute=false
}
};
p、 Start();
p、 WaitForExit();
}
}
}

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

dotnet %~n0.dll %*
显然,这是假设机器已安装.NET Core并且全局可用

c:\> "path\to\batch\file" -args blah

(此答案源自。)

更新.NET 5

以下内容适用于.NET 5正式发布之日/之后的2020年11月

(请参阅下面的“快速术语”部分,而不仅仅是“如何使用”部分)

如何(CLI) 预备知识
  • 下载.net 5 SDK的最新版本
台阶
  • 打开终端(例如:bash、命令提示符、powershell),并在与.csproj文件相同的目录中输入以下命令:
  • 例如:

    dotnet publish --output "c:/temp/myapp" --runtime win-x64 --configuration Release -p:PublishSingleFile=true -p:PublishTrimmed=true --self-contained true
    
    如何使用(GUI) 预备知识
    • 如果阅读NOV2020之前版本:Visual Studio预览的最新版本*
    • 如果正在阅读NOV2020+:Visual Studio的最新版本*
    *在以上两种情况下,最新的.net5 SDK将自动安装在您的电脑上

    台阶
  • 右键单击项目,然后单击发布

  • 单击开始并选择文件夹目标,单击下一步并选择文件夹

  • 输入任何文件夹位置,然后单击“完成”

  • 单击编辑

  • 选择目标运行时并勾选“生成单个文件并保存”*

  • 单击发布

  • 在发布应用程序的位置打开终端,然后运行.exe。例子:

  • 一点术语 目标运行时

    部署模式

    • 依赖于框架意味着生成了一个小的.exe文件,但应用程序假定在主机上安装了.Net 5
    • 自包含意味着一个更大的.exe文件,因为.exe包含框架,但您可以在任何计算机上运行.exe,无需预安装.Net 5。注意:使用自包含时,将生成其他依赖项(.dll),而不仅仅是.EXE
    启用ReadyRun编译
    TLDR:它相当于.Net5的提前编译(AOT)。预编译为本机代码的应用程序通常启动得更快。应用程序的性能更好(或更差!),这取决于许多因素。更多信息

    修剪未使用的组件
    当设置为true时,dotnet将生成一个非常精简和小的.exe,并且只包含它需要的内容。这里要小心。示例:在应用程序中使用反射时,您可能不希望将此标志设置为t
    dotnet publish --output "c:/temp/myapp" --runtime win-x64 --configuration Release -p:PublishSingleFile=true -p:PublishTrimmed=true --self-contained true