Aufrufen einer VB6-DLL-Funktion mit einem komplexen benutzerdefinierten Typ (UDT) aus C #

9

Ich schreibe eine C # -Anwendung, um eine VB6-DLL eines Drittanbieters aufzurufen. Ich habe Bezug auf die VB6 DLL in der Registerkarte Referenzen- & gt; COM hinzugefügt.

Eine bestimmte Methode in der DLL verwendet einen VB6 UDT (benutzerdefinierten Typ) als Parameter.

Dieser UDT wird als Struktur im automatisch generierten .NET-Wrapper für COM angezeigt. Die Struktur hat viele untergeordnete UDTs / Strukturen sowie Member vom Typ VBA.Collection (wie durch .NET-Metadaten gezeigt). Es hat auch reguläre Datentypen wie string, short, double, int usw.

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

%Vor%

Ich habe es auch versucht

%Vor%

Wenn ich es nicht mit Standard oder neu initialisiere, kann ich meinen C # -Code nicht kompilieren, da sich der Compiler über die Verwendung von nicht zugewiesenen Variablen beschwert.

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

%Vor%

Beim Aufruf dieser Methode der VB6-DLL erhalte ich einen Fehler:

  

Fehler: Versuch, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein   Hinweis darauf, dass 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:

Es gibt ein lokal entwickeltes ERP-Produkt, das die Add-on-Entwicklung mit VB6 unterstützt. Es hat eine Konfigurationsdatei, die die Namen der Add-On-DLLs angibt, die geladen werden sollen. Diese Addons werden dann in einem Menü in der ERP-Anwendung angezeigt. Bei einem Klick auf das Menü ruft das ERP eine Funktion mit dem Namen StartAddOn () auf, die in der VB6-DLL vorhanden sein sollte.

Ich wollte Add-On in C # entwickeln, also entwickelte ich ein einfaches VB6-Addon mit einer StartAddOn-Methode, die wiederum die Kontrolle an meine .NET-DLL übergibt.

Die .NET-DLL verwendet die Business-Klassen, die von dem ERP verfügbar gemacht werden, und übergibt Datenobjekte hin und her. In der .NET-DLL habe ich eine COM-Referenz zu der vom ERP-Anbieter veröffentlichten DLL hinzugefügt.

Also ist die Architektur so: ERP- & gt; VB6 AddOn mit StartAddOn-Methode- & gt; .NET DLL- & gt; verwendet COM DLL vom ERP-Anbieter und seine Datenklassen (Structs / UDTs) veröffentlicht.

Wie kann ich den Speicherfehler debuggen?

    
AllSolutions 16.05.2016, 18:46
quelle

1 Antwort

3

Wie sieht die Struktur aus? Es ist schon eine Weile her, seit ich irgendeine seriöse VB6-Entwicklung gemacht habe, aber eines der Dinge, an die ich mich erinnern kann, wenn ich zwischen zwei Sprachen anrufe, war VB6's Beharren auf der Dword-Ausrichtung aller seiner Strukturen. Wenn Sie beispielsweise einige Bytewerte in der Mitte gemischt haben, wird Padding eingefügt, sodass alle Werte auf einer geraden 4-Byte-Grenze ausgerichtet sind. Berücksichtigen Sie Folgendes:

%Vor%

Im Speicher gibt es 3 Bytes ungenutzten Platz zwischen B und C. Natürlich, wenn C # nicht die gleiche Auffüllung durchführt, kann es Ihre Werte ausschalten und allerlei Chaos verursachen.

Mit einigen Compilern (wie C) ist es möglich, einen Compiler-Schalter zu setzen, um diese Art der Ausrichtung zu verwenden. Ich weiß nicht, ob C # etwas Ähnliches hat. Wenn nicht, besteht die Lösung darin, einige Dummy-Felder der passenden Größe in Ihre Struktur auf der C # -Größe einzufügen.

Hier finden Sie einen Artikel, der weitere Informationen darüber enthält, wie VB6 UDTs ausrichtet: Ссылка

    
Steve In CO 25.05.2016 13:35
quelle