Проблема с конвертацией XAML в PNG, NetCore 3.1

Есть задача, переписать сервис с NetFramework 4.6.1, на netcore 3.1, с возможностью кросс-платформенного запуска приложения, однако в процессе миграции столкнулся с проблемой.

Приложение получает некий документ в формате PDF и штамп(ы), который(е) должны быть наложены на страницы этого самого документа, в формате XAML. Насколько я могу понять, XAML это формат WPF, который содержит информацию о разметке страницы. В пространстве System.Windows.Markup есть класс, который умеет парсить XAML, однако его реализция под NetCore (Microsoft.WindowsDesktop.App.WPF), по какой-то причине выдаёт ошибку:

System.Windows.Markup.XamlParseException: '"Вызов конструктора для типа "System.Windows.Controls.Canvas", удовлетворяющего указанным ограничениям привязки, привел к выдаче исключения.": номер строки "8" и позиция в строке "2".'
InvalidOperationException: Вызывающим потоком должен быть STA, поскольку этого требуют большинство компонентов UI.

Я пытался запустить тесты с аннотацией [STAThread], но это проблему не решает, к тому же совершенно непонятно, будет ли оно вообще работать в кросс-платформенном приложении.

Помимо этого, я попытался использовать для парсинга кросс-платформенную библиотеку AvaloniaUI, которая так же предоставляет методы для работы с XAML, но она до конца не дописана, не все методы реализованы, а те что реализованы, работают с ошибками, плюс ко всему XAML парсится некорректно, возможно из-за различий Xaml диалекта.

Код конвертера выделенный в отдельный NetCore WPF проект:

using System.IO;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace XamlLib
{
    public class XamlToPngConverter : IConverter
    {
        public byte[] ByteArray { get; set; }
        public int Width { get; set; }
        public int Height { get; set; }

        public XamlToPngConverter()
        {

        }


        public Stream Convert()
        {
            var mstream = new MemoryStream(ByteArray);
            var xaml = XamlReader.Load(mstream); // В этом месте возникает ошибка
            var element = xaml as FrameworkElement;
            Size renderingSize = new Size(Width, Height);
            element.Measure(renderingSize);
            Rect renderingRectangle = new Rect(renderingSize);
            element.Arrange(renderingRectangle);
            RenderTargetBitmap png = new RenderTargetBitmap(Width, Height, 96, 96, PixelFormats.Default);
            png.Render(element);


            PngBitmapEncoder enc = new PngBitmapEncoder();
            enc.Frames.Add(BitmapFrame.Create(png));
            var ms = new MemoryStream();
            enc.Save(ms);
            return ms;
        }
    }


    public interface IConverter
    {
        public byte[] ByteArray { get; set; }
        public int Width { get; set; }
        public int Height { get; set; }
        Stream Convert();
    }
}

Собственно, вопросы: 1. Будет ли работать вообще приложение с использованием библиотеки Microsoft.WindowsDesktop.App.WPF, скажем под линукс? 2. Существуют ли другие библиотеки для конвертации XAML в PNG? Насколько я понимаю падает именно парсинг XAML, так что интересует библиотека с парсером XAML.

В гугле не забанили, просто уже даже и не знаю что гуглить, слишком многое уже перегуглено. Заранее спасибо за любую помощь.


Ответы (0 шт):