对于面向.NET Core 1.0的控制台应用程序项目,我无法弄清楚如何在构建期间输出.exe。项目在调试中运行良好。
我已尝试发布该项目,但这也不起作用。有道理,因为.exe将是特定于平台的,但必须有一种方法。我的搜索仅引用了使用project.json的旧.Net Core版本。
无论何时我建立或发布,这都是我得到的。
答案 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)
答案 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>
中将其包装在一个示例中
答案 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();
}
}
}