C# VB6-DLL Funktion überschreiben

DrMueller

Erfahrenes Mitglied
Hallo Leute,

tatsächlich mal ein reales Problem und nicht eines, was ich zum Zeitvertreib versuche:
Wir schreiben ein neues DLL in C#, allerdings müsste da auf ein Teil der VB6-Funktion aufgerufen werden.

Leider klappt das mit dem Vererben und überschreiben nicht so wie im Lehrbuch, will heissen:

Ich kann die Klasse, welche im VB6 clsDetailAkt heisst, entweder als Interface übergeben oder als Class namens clsDetailAktClass, allerdings motzt er da:
"Interop Type can not be embedded...'

Wenn ichs als Interface nehme, kann ich dann natürlich nichts überschreiben, wenn ichs als Class implementiere kommt obiger Fehler.

Was ich noch als Idee hatte, war folgendes:

Code:
    public static class abgeleitet
    {
        public static bool UpdateAktivity2(this clsDetailAkt t)
        {
            ///Mach irgendwas
            return t.UpdateAktivity();
        }
    }

Allerdings wäre das Ziel, dass UpdateAktivity komplett überschrieben wird. Wenn es UpdateAktivity taufe, also gleich wie in der Base-Klasse, scheint dies aufgerufen zu werden und nicht meine Abwandlung.


Gibts da irgend eine saubere Lösung, wie man so was machen könnte?



Wie immer vielen Dank im Voraus

Müller Matthias
 

Cromon

Erfahrenes Mitglied
Hallo Matthias

Also in diesem Fall hier scheint es als hätte die Ursache nichts mit dem Fehler an sich zu tun, aus diesem Grund muss ich etwas weiter ausholen. Visual Basic 6 wird in unverwalteten und nativen Code umgewandelt und zugleich kompatibel zu COM. COM ist wenn man so will eine Art Vorgänger von .NET bzw viele Mechanismen von .NET bauen auf COM auf. Also ist es nicht verwunderlich dass Funktionalitäten zwischen COM und .NET sehr einfach ausgetauscht werden können. Dies geschieht über eine weitere DLL, die dann verwaltet ist und alle Informationen und Typen des COM-Servers anhand dessen tlb oder IDL erstellt. Dabei enstehen dann diese Pseudocoklassen wie clsDetailAkt und die Interface. Diese Klassen sind aber nicht etwa diejenigen aus der DLL sondern lediglich eine Art Wrapper die zum Beispiel die Funktionsaufrufe anhand der Attribute in den passenden IDispatch::Invoke-Aufruf umwandeln (Siehe IDispatch::Invoke).

Nun ist es aber irgendwie doof da immer noch eine zusätzliche DLL zu haben die man dann referenzieren kann welche aber lediglich so unnötigen Code drin hat. Deshalb gibt es glaub seit .NET 4.0 die Möglichkeit diesen Code direkt einzubinden (= embed). Nun ist das aber wohl für deine DLL so nicht möglich - ab hier vermute ich jetzt nur - weil sich Visual Studio nicht sicher ist, ob die Typen nicht vielleicht noch andere Dinge drin haben und/oder weil nicht alle nötigen Infos vorhanden sind um die Stubs zu generieren. So viel zum Hintergrund deines Fehlers.

Kurz und bündig: Um den Fehler zu vermeiden gehe auf die Eigenschaften der Referenz und stelle "Embedd interop types" auf false.

Nichts desto trotz ändert das aber nichts an der Tatsache dass das erben und überladen von diesen Interoptypen nicht wirklich sinnvoll ist. Wie ich erwähnte sind das nicht wirklich die Typen aus der DLL sondern lediglich Wrapper. Wenn du einen neuen Typ willst so erbe vom Interface, so ist das ja auch gedacht.

Gruss
Cromon