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?
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: Ссылка
Tags und Links c# dll com-interop vb6 user-defined-types