ufrufen einer VB6-DLL-Funktion mit einem komplexen benutzerdefinierten Typ (User Defined Type, UDT) aus C

Ich schreibe eine C # -Anwendung zum Aufrufen einer VB6-DLL eines Drittanbieters. Ich habe auf der Registerkarte Referenzen-> COM einen Verweis auf die VB6-DLL hinzugefügt.

Eine bestimmte Methode in der DLL verwendet einen VB6-UDT (User Defined Type) als Parameter.

Diese UDT wird im automatisch generierten .NET-Wrapper für COM als Struktur angezeigt. Die Struktur enthält viele untergeordnete UDTs / Strukturen sowie Mitglieder des Typs VBA.Collection (wie in .NET-Metadaten dargestellt). Es hat auch reguläre Datentypen wie String, Short, Double, Int usw.

Ich initialisiere diese Struktur in meinem C # -Code als:

udtEmployee udtEmpData = default(udtEmployee);

Ich habe es auch versucht

udtEmpData = new udtEmployee();

Wenn ich es nicht mit "default" oder "new" initialisiere, kann ich meinen C # -Code nicht kompilieren, da sich der Compiler über die Verwendung einer nicht zugewiesenen Variablen beschwert.

Ich muss diese Struktur als Referenz übergeben. Ich mache es so:

clsEmployee.SetData(ref udtEmpData);

Während ich diese Methode der VB6-DLL aufrufe, erhalte ich folgende Fehlermeldung:

Error: Es wurde versucht, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass ein anderer Speicher beschädigt ist.

Was ist der Grund und was ist die Lösung?

Hinweis, ich kann die VB6-DLL nicht ändern, da ich ihren Quellcode nicht habe. Ich benutze VS 2005.

EDIT 1:

Hier ist ein vollständiger Hintergrund:

There ist ein lokal entwickeltes ERP-Produkt, das die Add-On-Entwicklung mit VB6 unterstützt. Es verfügt über eine Konfigurationsdatei, die die Namen der zu ladenden Add-On-DLLs angibt. Diese Addons werden dann in einem Menü in der ERP-Anwendung angezeigt. Beim Anklicken des Menüs ruft das ERP eine Funktion mit dem Namen StartAddOn () auf, die in der VB6-DLL vorhanden sein sollte.

Ich wollte ein Add-On in C # entwickeln, also habe ich ein einfaches VB6-Add-On mit einer StartAddOn-Methode entwickelt, das die Steuerung an meine .NET-DLL übergibt.

Die .NET-DLL verwendet die vom ERP bereitgestellten Geschäftsklassen und übergibt Datenobjekte hin und her. In der .NET-DLL habe ich einen COM-Verweis auf die vom ERP-Anbieter veröffentlichte DLL hinzugefügt.

Die Architektur sieht also folgendermaßen aus: ERP-> VB6-AddOn mit StartAddOn-Methode -> .NET-DLL-> verwendet die vom ERP-Hersteller veröffentlichte COM-DLL und ihre Datenklassen (Strukturen / UDTs).

Wie kann ich den Speicherfehler beheben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage