У меня есть тестовое приложение WPF, которое я изменил, чтобы оно теперь могло запускаться как консольное приложение, вот так. Как динамически быть консольным приложением или приложением Windows
Мое приложение создано так, что оно не использует какие-либо пакеты графического интерфейса WPF при запуске в качестве консоли. Я сделал это с помощью интерфейса, поэтому, когда я устанавливаю текстовое поле или пишу на консоль, это делается следующим образом.
public interface IUserOutput
{
abstract void DisplayOutput(string msg);
}
class ConsoleOutput : IUserOutput
{
public void DisplayOutput(string msg)
{
Console.WriteLine(msg);
}
}
public class TextBoxOutput : IUserOutput
{
public void DisplayOutput(string msg)
{
if (TestWPF.App.Current != null)
{
TestWPF.App.Current.Dispatcher.BeginInvoke(new Action(() =>
{
((MainWindow)TestWPF.App.Current.MainWindow).TextBox.Text += msg + "\r\n";
}));
}
}
}
И в коде я либо инициализирую реализацию WPF, либо консоль.
Если я попытаюсь запустить его как консольное приложение в Linux, я получу сообщение об отсутствии «Microsoft.WindowsDesktop.App», версия 8.0.0 (x64).
Я знаю, что невозможно запустить WPF с графическим интерфейсом в Linux, но каким-то образом можно запустить приложение WPF, работающее как консольное приложение в Linux.
Я попытался загрузить пакет nuget для «Microsoft.WindowsDesktop.App» и поместить папку ref внутрь /usr/dotnet/shared/Microsoft.WindowsDesktop.App/8.0.6/ и /usr/dotnet/shared/Microsoft.WindowsDesktop. App/8.0.0/, но у меня выдает ту же ошибку, можно ли как-то заставить Linux думать, что он установлен, и все равно его запускать?
Или есть способ построить проект так, чтобы Linux не видел, что ему требуется «Microsoft.WindowsDesktop.App»?
Спасибо
Совсем нет, см. avaloniaui.net/FAQ
Это не WPF, вот цена WPF avaloniaui.net/xpf#pricing
Я говорю не о XPF, а просто об интерфейсе Avalonia. Вместо приложения WPF вы создадите приложение пользовательского интерфейса Avalonia.
Хорошо, нам потребуется преобразовать наше старое приложение WPF в это, это потребует некоторой работы, возможно, если бы мы могли запустить его как консоль, никаких действий не потребовалось бы, спасибо за предложение.
Альтернативой было бы переместить весь код WPF в библиотеку классов, которая загружается динамически только тогда, когда ваше приложение работает в Windows.
Или разверните свое приложение как автономное.
Предполагая, что у вас есть веская причина для этого (например, об извлечении соответствующих частей программного обеспечения в .NET core+ в качестве консольного приложения не может быть и речи), вы можете запустить WPF в Linux, но с использованием Wine. Он также будет фактически эмулировать графический интерфейс Linux. См. эту статью: https://ccifra.github.io/PortingWPFAppsToLinux/Overview.html
Да, это работает, большое спасибо.
Да, но это очень дорого :-)