Я пытаюсь добавить некоторые базовые отчеты в приложение .Net 8.0 C# WinForms с помощью конструктора отчетов Microsoft RDLC и пакета nuget ReportViewerCore.WinForms, и столкнулся с рядом проблем.
Есть ли у кого-нибудь опыт, как заставить это работать и преодолеть эти проблемы?
Шаги, которые я предпринял на данный момент:
public class Class1 : IClass1
{
public int MyProperty { get; set; }
}
public interface IClass1
{
int MyProperty { get; set; }
}
Class1, добавил к нему строковое свойство, перекомпилировал и попытался удалить и повторно добавить его в качестве источника данных, чтобы получить ту же ошибку.Я пришел к выводу, что, похоже, существует какая-то проблема с тем, что дизайнер отчета может определить типы CLR в классе, извлечение интерфейса в некоторой степени помогает смягчить эту проблему, но основная проблема может заключаться в том, что дизайнер, в частности " Мастер настройки источника данных», похоже, пытается использовать неправильную версию сборки System.Runtime.
Я пытался выяснить, поможет ли для решения этой проблемы добавление правильной системной DLL-библиотеки времени выполнения в папку установки расширения, но был загнан в тупик из-за того, что не смог определить, где на самом деле было установлено расширение, а также какую DLL я следует скопировать в это место, если я смогу понять, куда его поместить.
Поиск здесь этой проблемы показывает, что у других в прошлом была подобная проблема, но я не могу найти решения, которое решило бы мою конкретную проблему. Я также пробовал использовать более старые версии пакетов nuget ReportViewer, ориентированные на .Net Framework, и они дали мне те же результаты.
Если мне нужно извлечь интерфейсы для любых POCO, которые я хочу использовать для отчетов, я могу с этим смириться. Однако, если я не смогу использовать какие-либо сложные типы (например, объекты, содержащие списки других объектов) для отчетов, это будет препятствием.
См. эту ссылку для получения помощи по Visual Studio 2022: github.com/lkosson/…





Как поясняется в README репозитория ReportViewerCore.WinForms, мастер создания новых наборов данных терпит неудачу при попытке обнаружить классы из проекта. Официальный обходной путь — добавить в проект файл «.xsd» со схемой классов.
В репозитории представлен фрагмент кода для автоматического создания необходимых файлов «.xsd». Вам нужно изменить массив «типы», чтобы включить классы, которые вы хотите использовать:
var types = new[] { typeof(ReportItemClass1), typeof(ReportItemClass2), typeof(ReportItemClass3) };
var xri = new System.Xml.Serialization.XmlReflectionImporter();
var xss = new System.Xml.Serialization.XmlSchemas();
var xse = new System.Xml.Serialization.XmlSchemaExporter(xss);
foreach (var type in types)
{
var xtm = xri.ImportTypeMapping(type);
xse.ExportTypeMapping(xtm);
}
using var sw = new System.IO.StreamWriter("ReportItemSchemas.xsd", false, Encoding.UTF8);
for (int i = 0; i < xss.Count; i++)
{
var xs = xss[i];
xs.Id = "ReportItemSchemas";
xs.Write(sw);
}
Если вы используете файлы «.xsd», все должно работать.
Вся информация есть в разделе Проектирование новых отчетов репозитория.
Спасибо вам большое за это. Похоже, проблема связана с самим дизайнером RDLC (а не с репозиторием ReportViewerCore, который, насколько я понимаю, предназначен для добавления поддержки отчетов, а не с дизайнером), поэтому было бы неплохо, если бы Microsoft включила эту информацию в установщик дизайнера отчетов RDLC и не заставил нас полагаться на чтение документации readme в стороннем репозитории, который его использует!
Насколько я знаю, конструктор RDLC не предназначен для работы на .NET 8. Кажется, их это просто не волнует. То, что создание отчетов работает даже в .NET 8, — это работа по декомпиляции механизма отчетов и его перекомпиляции для .NET 8 в проекте с открытым исходным кодом ReportViewerCore.
Другие вещи, которые я также попробовал: - Нашел папку установки расширения дизайнера отчетов (C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\Rdlc) и нашел файл .net. 8.0 (C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.5) и скопировал последние в первые. Это устраняет невозможность найти System.Runtime, но вводит новую ошибку, связанную с невозможностью загрузить System.Object из System.Private.CoreLib, поскольку родительский объект не существует.