Есть ли аналог ReportViewer для C# .NET выше 4 версии?
Пишу C# WinForms [EF-framework, ADO.NET ] + MS SQL Server приложение с .NET версии 8.0 в Visual Studio 2022. В техническом задании обязательно необходимо делать отчеты и отправлять их на печать, в примерах показана работа с ReportViewer, но он не работает с версиями .NET выше 4.
Переписывать приложение не хочется, уже написана большая часть репозиториев, сервисов, фактори интерфейсы с реализацией их методов и многое другое.
Поэтому вопрос: Существует ли удобный аналог ReportViewer'а для .NET 8 и выше?
Для .NET Core и для .NET 5+ нет аналогов ReportViewer. Сам по себе ReportViewer относится к WinForms, а WinForms сейчас никак не развивается. Ну практически не развивается. Печально еще то, что нет аналогов и для WPF. Но как вам уже написали такие контролы есть у DevExpress, Telerik и FastReport. Но как правило они платные. А если не хотите покупать, то можете сами выкрутиться. То есть вы можете создать сборку на .NET Framework 4.х, внутри нее создать User Control с формой и ReportViewer. Зарегестрируйте интерфейс контрола через ComVisible(true) и подключайте ее к себе в проект как COM-библиотеку. 100% такое заработает. Через обычную рефлексию Assembly.LoadFrom врядли взлетит, потому что для .NET Framework и для .NET 5+ разный CLR-рантайм, поэтому можете нарваться на исключение вроде FileLoadException, но если зарегестрируете как COM, то будет работать. Но опять же только в среде Windows.
Попробовал ваш метод, не выходит. Может я что-то неправильно понял и что-то делаю не так? Я создал другой проект .NET Framework, в котором настроил и подготовил отчеты, собрал релиз в .dll и подключил к основному проекту как COM-библиотеку. При попытке загрузки объекта из библиотеки вылетает исключение:
System.MissingMethodException: 'Method not found: 'Void System.AppDomainSetup.set_ActivationArguments( System.Runtime.Hosting .ActivationArguments)'.'
Нейронки говорят, что прямой референс на сборки, таргетированные под .net framework из под .net 8 не поддерживаются. CLR пытается вызвать недоступный API и падает.
Неделю пытаюсь поправить и пока что не получается. Что делать?
Нейронки говорят, что прямой референс на сборки, таргетированные под .net framework из под .net 8 не поддерживаются. CLR пытается вызвать недоступный API и падает.
Вот именно, что вы через COM и не делаете прямой референс на сборки, т.к. он не поддерживается из-за разных версий рантайма.
Скорее всего может быть проблема в том, что начиная с .NET 5+ есть какие-то ограничение регистрации с ComVisible(true) .NET сборок как COM-объектов. Ну то есть они регистрируются как Inproc, а не как Outproc. Это надо погуглить. Или спросите у той же нейронки.
DevExpress поддерживает даже .net 9
Всего $799.99 и пользуйся на здоровье.