Top.Mail.Ru
Ответы

Проблема с использованием своей 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 библиотеки:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
 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 вылетает исключение:

1
 System.MissingMethodException: 'Method not found: 'Void System.AppDomainSetup.set_ActivationArguments(System.Runtime.Hosting.ActivationArguments)'.' 

Перепробовал множество вариантов, нейронки не помогают. Уже не знаю что делать, а время идет...

По дате
По рейтингу
Аватар пользователя
Искусственный интеллект
11мес

Ну а нахрена так сложно-то? Сделай все на 4.8 и вся любовь.
Запустить работающий СОМ на современной системе - это тот еще гемор.
Если совсем времени нет, сделай отчеты как отдельное приложение просто.

Дело в том, что в СОМ обнаружилась куча дыр, и мелкософт, ничтоже сумняшеся, накатил сверху на все это счастье кучу дополнительной безопасности, с уровнями, дескрипторами и прочим счастьем. В результате заставить все это работать просто нереально.
Ну и зачем ты вообще вызвал к жизни этого дервнего ктулху? Нужно взаимодействие между приложениями - есть SOA, есть REST, нафига COM-то нужен? Брррр.....

Аватар пользователя
Ученик
11мес

та я уже понял что фигни наделал и сейчас все откачу.
переписывать все на 4.8 сильно лень, там нет entity framework (есть, но ef6 - вместо efcore), работы с nullable, некоторых пакетов, что я использовал, а это переписывать все ентити классы, многие сервисы, контексты работы с базой и вообще много ненужных телодвижений.

я сейчас просто забил, сделаю простую заглушку при помощи questpdf и пусть катится к черту.

Аватар пользователя
Гуру
11мес

Не пробовал на .Net 8 переписать и использовать "ReportViewerCore.WinForms", вместо Фрейвочного?

https://developercommunity.visualstudio.com/t/microsoftreportingwinformsreportviewer-initializat-1/864956

Аватар пользователя
Ученик
11мес

ReportViewerCore также работать отказался

Аватар пользователя
Ученик
11мес

попробуй окунь библиотеку хз



Видео по теме