Проблема с использованием своей COM библиотеки C#.
Пишу C# WinForms [EF-framework, ADO.NET ] + MS SQL Server приложение с .NET версии 8.0 в Visual Studio 2022. В техническом задании обязательно необходимо делать отчеты и отправлять их на печать, в примерах показана работа с ReportViewer, но он не работает с версиями .NET выше 4.
Я создал другой проект на .NET Framework 4.8.1, в котором настроил работу ReportViewer и написал формы для вывода отчетов. Затем собрал проект в релиз .dll и подключил его как COM библиотеку в основной проект. Написал форму для открытия окна из COM библиотеки:
namespace Warehouse // <-- основной проект
{
public partial class TestReportForm : Form
{
public TestReportForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Создаём COM-объект
var report = new ReportViewerWrapper.InvoiceReport(); // будет работать, если добавлена COM-ссылка
report.ShowReport(); // вызываем метод, который внутри вызывает ShowDialog()
}
}
}
namespace ReportViewerWrapper // <-- проект для COM библиотеки
{
[ComVisible(true)]
[Guid("F1234567-ABCD-1234-EFAB-56789ABCDEF0")] // GUID для интерфейса
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IInvoiceReport
{
void ShowReport(); // Метод, доступный из .NET 8
}
[ComVisible(true)]
[Guid("01234567-ABCD-1234-EFAB-56789ABCDEF0")] // GUID для класса
[ClassInterface(ClassInterfaceType.None)]
public partial class InvoiceReport : Form, IInvoiceReport
{
public InvoiceReport()
{
InitializeComponent();
}
private void InvoiceReport_Load(object sender, EventArgs e)
{
this.invoice_DetailsTableAdapter.Fill(this.transactionDBDataSet.Invoice_Details);
this.invoicesTableAdapter.Fill(this.transactionDBDataSet.Invoices);
this.reportViewer1.RefreshReport();
}
public void ShowReport()
{
this.ShowDialog(); // Called from .NET 8
}
}
} При попытке выполнить метод button1_click вылетает исключение:
System.MissingMethodException: 'Method not found: 'Void System.AppDomainSetup.set_ActivationArguments(System.Runtime.Hosting.ActivationArguments)'.' Перепробовал множество вариантов, нейронки не помогают. Уже не знаю что делать, а время идет...
Ну а нахрена так сложно-то? Сделай все на 4.8 и вся любовь.
Запустить работающий СОМ на современной системе - это тот еще гемор.
Если совсем времени нет, сделай отчеты как отдельное приложение просто.
Дело в том, что в СОМ обнаружилась куча дыр, и мелкософт, ничтоже сумняшеся, накатил сверху на все это счастье кучу дополнительной безопасности, с уровнями, дескрипторами и прочим счастьем. В результате заставить все это работать просто нереально.
Ну и зачем ты вообще вызвал к жизни этого дервнего ктулху? Нужно взаимодействие между приложениями - есть SOA, есть REST, нафига COM-то нужен? Брррр.....
та я уже понял что фигни наделал и сейчас все откачу.
переписывать все на 4.8 сильно лень, там нет entity framework (есть, но ef6 - вместо efcore), работы с nullable, некоторых пакетов, что я использовал, а это переписывать все ентити классы, многие сервисы, контексты работы с базой и вообще много ненужных телодвижений.
я сейчас просто забил, сделаю простую заглушку при помощи questpdf и пусть катится к черту.
Не пробовал на .Net 8 переписать и использовать "ReportViewerCore.WinForms", вместо Фрейвочного?
https://developercommunity.visualstudio.com/t/microsoftreportingwinformsreportviewer-initializat-1/864956
ReportViewerCore также работать отказался
попробуй окунь библиотеку хз