Создать консольное приложение.NET Core для вывода EXE?
Для проекта консольного приложения, ориентированного на.NET Core 1.0, я не могу понять, как получить.exe для вывода во время сборки. Проект работает нормально в отладке.
Я пытался опубликовать проект, но это тоже не работает. Имеет смысл, так как.exe будет зависеть от платформы, но должен быть способ. Мои поиски нашли только ссылку на более старые версии.Net Core, которые использовали project.json.
Всякий раз, когда я создаю или публикую, это все, что я получаю.
2 ответа
В целях отладки вы можете использовать DLL. Вы можете запустить его с помощью dotnet ConsoleApp2.dll
, Если вы хотите сгенерировать исполняемый файл, вы должны сгенерировать автономное приложение.
Чтобы сгенерировать автономное приложение (например, в Windows), вы должны указать целевую среду выполнения (на какую ОС вы ориентируетесь).
Только до версии.NET Core 2.0: сначала добавьте идентификатор времени выполнения целевых сред выполнения в csproj ( список поддерживаемых ридов):
<PropertyGroup>
<RuntimeIdentifiers>win10-x64;ubuntu.16.10-x64</RuntimeIdentifiers>
</PropertyGroup>
Вышеуказанный шаг больше не требуется, начиная с.NET Core 2.0.
Затем установите желаемое время выполнения при публикации приложения:
dotnet publish -c Release -r win10-x64
dotnet publish -c Release -r ubuntu.16.10-x64
Для тех, кто использует Visual Studio и хочет сделать это через графический интерфейс, см. Шаги ниже:
Следующее будет производить в выходной каталог,
- все ссылки на пакеты
- выходная сборка
- загрузочный exe
Но не содержит всех сборок среды выполнения 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
Если файл.bat приемлем, вы можете создать файл bat с тем же именем, что и у dll (и поместить его в ту же папку), а затем вставить следующее содержимое:
dotnet %0.dll %*
Очевидно, это предполагает, что на машине установлен.NET Core.
Назовите это без части.bat. то есть: c:\>"path\to\program" -args blah
(этот ответ получен из комментария Чета)
Вот мой хакерский обходной путь - создайте консольное приложение (.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();
}
}
}