2016-03-31 11 views
3

Ich möchte in der Lage sein, eine Klassenschnittstelle zu programmieren, die ich in C# - und VB6-Klassen implementieren kann, so dass diese Klassen in VB6-Code in der gleichen Weise behandelt werden können, aber ich kann das nicht funktionieren.Wie kann ich eine Schnittstelle zwischen VB6 und C# teilen?

In VB6 möchte ich Klasse VB6Class mit dem Schlüsselwort implementiert haben, um eine Schnittstelle ISharedInterface zu implementieren.

In C# möchte ich eine andere Klasse C# Klasse haben, die ich COM als ISharedInterface implementieren kann.

Das Ziel ist es, dass Code VB6 dann in der Lage sein Klasse arbeiten auf VB6Class und C# über ISharedInterface ohne Fürsorge, die Sprache der Unterricht in gebaut wurden.

ich diese Technik als eine Möglichkeit nutzen wollen weg zu migrieren von VB6 durch sukzessives Neuschreiben alles am VB6-Ende und wenn ich Schnittstellen implementieren kann, die ich bereits in VB6 innerhalb von C# habe, wäre dies ideal. Aber selbst wenn ich eine Schnittstelle in C# neu schreiben müsste, um sie an VB6 zu senden, wäre das immer noch nützlich (dh es ist mir egal, ob die Schnittstelle in C# geschrieben und COM angezeigt oder in COM geschrieben und von C#, solange beide Seiten der Sprachbarriere auf dieselbe Schnittstelle verweisen können).

Ich finde das überraschend schwer. Ich kann auf eine Schnittstelle in C# verweisen, die von COM kommt, aber ich kann sie nicht als sichtbare COM-Schnittstelle nach COM exportieren. Wenn ich als Alternative versuche, ein Interface in C# selbst zu erstellen, habe ich keine Möglichkeit gefunden, es direkt über COM und verschiedene Workarounds zu sehen. Ich habe versucht, es indirekt zu benutzen, wie zum Beispiel eine Stub-Klasse zu erstellen Das, wenn COM sichtbar ist, erhöht Laufzeitfehler in VB6, wenn ich versuche, die exposed Stub-Klasse zu implementieren (obwohl sie kompiliert werden).

Ich habe derzeit keine gute Lösung für diese und nur eine schrecklich klobige Arbeit, die separate Schnittstellen in C# und VB6 zu implementieren, die C# -Methoden direkt zu COM verfügbar machen und erstellen Sie eine Wrapper-Klasse in VB6, die einfach die Schnittstellenmethoden umleitet zu den zugrunde liegenden wahren Methoden.

Was ist der beste Weg, um eine einzige Schnittstelle (entweder in VB6 oder C#) zu erstellen, auf die beide Sprachen verweisen können, ohne dass ich die Schnittstellendefinition duplizieren muss?

+0

In der Tat. Der Umstieg auf C# ist das Ziel und wir haben bereits eine C# -Schicht, die die gesamte Schnittstellenlogik (ich meine hier die Benutzerschnittstelle) handhabt. Der nächste Schritt besteht darin, die Geschäftslogik zu migrieren. Offensichtlich ist eine Möglichkeit, einen "Big Bang" zu machen, alles auf einmal zu konvertieren, möglicherweise mit einem Konvertierungstool, aber es gibt eine Menge VB6-Code und ich denke über schrittweise Ansätze nach, um das Problem zu lösen. Wenn ich mit freigegebenen Klassenschnittstellen zusammenarbeiten kann, gibt es große Codeabschnitte, die einer unabhängigen Migration zugänglich werden. – DMFW

Antwort

4

Was ist der beste Weg, um eine einzige Schnittstelle (entweder in VB6 oder C#) zu erstellen, auf die beide Sprachen verweisen können, ohne dass ich die Schnittstellendefinition duplizieren muss?

die Schnittstelle in IDL schreiben und in einen Typ lib kompilieren, die in VB und importiert (tlbimp) in .NET verwiesen wird. (Sie müssen die Neugenerierung von IIDs vermeiden, die VB6 ausführen wird, wenn Sie es zum Definieren der Schnittstelle verwenden.)

Sie könnten die Schnittstelle in .NET definieren, aber das würde mehr Schritte erfordern.

+0

Danke für den Zeiger. Dies war ein Ansatz, von dem ich nicht einmal wusste, und er eröffnet definitiv eine neue Möglichkeit, dies zu untersuchen. Sieht aus, als müsste ich hier ziemlich viel lesen und experimentieren, da ich mit IDL nicht vertraut bin, aber wenn ich es schaffen kann, dann könnte es genau das sein, wonach ich suche. Ich akzeptiere das als Antwort. – DMFW

+1

@DMFW Es ist lange her, seit ich das letzte Mal getan habe (und vor zwei Jobs), also habe ich keine Beispiele mehr zur Hand, fürchte ich. COM ist weiterhin ein zentraler Bestandteil von Windows, weshalb das SDK, wie es in VS enthalten ist, den IDL-Compiler "midlc.exe" enthält. – Richard

0

Ich bin mir nicht sicher, ob ich das Problem falsch verstehe, aber warum möchten Sie die Schnittstelle in VB6 implementieren? Wenn Sie eine Schnittstelle haben, die in VB6 und C# implementiert ist, dann können Sie Code duplizieren, der im Wesentlichen dasselbe tut. Wenn Sie an der Migration von VB6 arbeiten, möchten Sie die Menge an VB6-Code begrenzen, den Sie schreiben.

Ich arbeite derzeit mit einer großen VB6-Anwendung und alle neuen Entwicklungen werden in C# durchgeführt. Ich habe ungefähr ein Dutzend C# -Assemblies und nur einer von ihnen ist COM ausgesetzt. Es ist nur eine kleine Assembly, die die Methoden offenlegt, die ich über COM benötige, damit ich sie direkt in meinem VB6-Projekt verwenden kann. Sie können eine Wrapperklasse in VB6 erstellen, wie Sie gesagt haben, um die Aufrufe der C# -Assembly zu zentralisieren.Dies ist, was ich in unserem Projekt getan habe, so dass der Wrapper den Verweis auf die Assembly initialisieren kann, wenn sie zum ersten Mal verwendet wird, anstatt sie jedes Mal zu tun, wenn sie verwendet wird.

Es klingt also wie Ihre "klobige" Problemumgehung, die Sie derzeit verwenden, ist mehr in der Richtung von dem, was ich getan habe. Vielleicht ist der Hauptunterschied, dass ich keine meiner tatsächlichen C# -Methoden gegenüber COM verfügbar mache. Alles ist in meiner COM-Interface-Baugruppe erledigt. Wenn es an der Zeit ist, den VB6-Code zu entfernen, wird die COM-Schnittstelleneinheit einfach weggeworfen und der Rest des C# -Codes/der C# -Baugruppen hat keine Verbindungen zu COM. Wir haben bereits einige andere Produkte, die die gleichen C# -Assemblys teilen und sie verweisen sie direkt, so dass die COM-Schnittstelle nicht mehr betroffen ist.

+0

Ich möchte keine neuen Schnittstellen in VB6 implementieren. Es ist mehr, dass ich ein paar Schlüsselschnittstellen habe, die bereits in VB6 existieren und dort weithin referenziert sind, die ich gerne in C# wiederverwenden würde. Eine solche Schnittstelle heißt IBusObj. Es gibt eine Menge Framework-Code für den Anwendungstyp, der sich früh an diese IBusObj-Schnittstelle bindet. Ich hatte gehofft, dass ich in der Lage wäre, neuen Code in C# über diese Schnittstelle zu schreiben, so dass das vorhandene VB6-Framework die C# -Objekte genauso sehen würde, wie es VB6 IBusObj-Objekte sieht. Wir könnten dann aufhören, neuen VB6-Code für neue IBusObj-Klassen zu schreiben und nach und nach alte zu migrieren. – DMFW

+0

Naiv scheint dieser Ansatz wie es funktionieren könnte. Sie können auf die VB6-DLL verweisen, die die IBusObj-Schnittstelle aus C# definiert, und Klassen erstellen, die von ihr erben. Der Code wird kompiliert. Aber ich konnte nicht herausfinden, wie (oder ob ich es kann) eine C# -Typ-Bibliothek so zu COM zurückführt, dass COM die C# -Klasse als nur ein weiteres IBusObj sieht. Wenn ich das könnte, müsste ich keine Wrapper-Klassen schreiben. – DMFW