2009-04-19 5 views
0

Wir haben eine große VB6-Anwendung, und da wir Dinge ändern/reparieren müssen, verschieben wir Abschnitte zu. NET, Targeting das Framework 2.0. Wir haben eine Reihe von Klassen in eine .net-DLL verschoben, und sie sind so eingerichtet, dass sie für com verfügbar sind..Net COM DLL funktioniert nicht von vb6 über appdomains

Hier ist das Problem: MainAppVB6.exe instanziiert DOTNET_COM.ComClass. Es übergibt dies an eine Methode in einer difference .net dll, die es über eine appdomain übergibt. Dies ist überhaupt kein Problem für COM-Objekte, die in vb6 geschrieben sind.

.net sehen Sie die appdomain Grenze, und möchte die Objekte serialisierbar sein oder marshalbyref. Da wir den .net-Teil benötigen, um Daten zu ändern, die zurück in vb6 gelangen, funktioniert serializable nicht. Wenn wir die Klassen bei Inherits MarshalByRefObject markieren, erhalten wir "Dieser Remoting-Proxy hat keine Channel-Senke, was bedeutet, dass entweder der Server keine registrierten Server-Kanäle hat oder die Anwendung keinen geeigneten Client-Kanal hat, um mit dem Server zu sprechen".

Es gibt keine Kanäle - wir gehen nur über eine appdomain in der gleichen DLL. Es scheint, dass .net das Objekt nicht als COM behandelt, was es tun sollte.

Wenn ich sowohl marshalbyref und serializable entfernen, funktionieren die Dinge nur, wenn das com-Objekt von vb6 instanziiert wird. Wenn die .NET-Funktionalität in der App-Domäne das Objekt erstellt und an vb6 zurückgegeben wird, gibt vb6 Automatisierungsfehler.

Ein sehr hässlicher Kludard ist es, das Objekt in der neuen Appdomain zu serialisieren, das XML zurückzusenden und vb6 deserialisieren zu lassen, aber das erscheint lächerlich.

Wer hat irgendwelche Ideen?

Vielen Dank.

Seth

Antwort

0

Sie können einen Delegaten an die entsprechenden Mutatormethode auf COM-Klasse in Ihrer ersten .NET-Methode erstellen, dass die Delegierten über die AppDomain Grenze passieren, verwenden Sie diese Delegaten Ihr COM-Objekt in den zweiten mutieren. NET-Methode und dann das mutierte Objekt zurück zu VB6. Die Methoden in der Marshal Class könnten sich als nützlich erweisen. :)

Bearbeiten von Kommentar: Was ist mit Erstellen einer .NET-Kopie der VB6-Klasse in der ersten. NET-Aufruf, die Weitergabe dieses neuen Objekts um alle. NET-Aufrufe müssen Sie machen und dann reparieren Sie Ihr COM-Objekt gehen zurück. Das könnte einfacher sein als die Deserialisierung in vb6.

+0

haben, die für ein paar Eigenschaften funktionieren würde, aber der Code in der separaten Appdomain hat Dutzende von Eigenschaften zu modifizieren sowie neue Objekte zu Sammlungen hinzufügen. Es analysiert Daten, füllt das com-Objekt mit diesen Ergebnissen und gibt es an vb6 zurück. Ich neige dazu, es nur die Serialisierung zurückgeben ... –

0

Sie müssen eine intermediäre Assembler-Fassade erstellen. Dann erstellen Sie eine AppDomain in der Anwendung Fassade - es wird die Verantwortung der Verwaltung der Pipeline Ihrer Anwendung, die die DLL Vb6 haben.

Vb < ===> Fassade (AppDomain) < ====> Anmelden, dass die DLL VB6

Verwandte Themen