2012-04-04 4 views
0

Ich weiß nicht viel über Com Plus Interop-Dienste in .NET - Ich lasse .NET all die schmutzige Arbeit und ich drücke meine Finger, es wird funktionieren. Nun, jetzt stecke ich fest.Passing vb6 Objekttyp Parameter byref von .NET Interop Ursachen Typ Mismatch

Ich habe einen Verweis auf eine COM-DLL kompiliert mit VB6 in meinem VS 2010 C# -Programm. Dies ist eine Rechnung, die ich erstelle.

I instanziiert ein Objekt:

UIInvoice Invoice = new CUIInvoice(); 

Und ich einige Rechnungskopf Eigenschaften dann eingestellt:

Invoice.set_InvoiceType("VO"); 
Invoice.set_InvoiceTypeID(2); 

Und jetzt möchte ich einige Rechnung Detaillinien erstellen, die ich durch den Aufruf der tun Methode eines untergeordneten Objekts der Rechnung hinzufügen:

Invoice.InvoiceDetails.Add("StringParam1", "StringParam2", Invoice); 

Der dritte Parameter der Funktion Anruf in meinem VB6 hinzufügen Funktion wie folgt definiert:

ByRef Parent As Object 

Wenn ich mein .NET-Programm ausführen, ich eine „Typenkonflikt“ Fehlermeldung angezeigt, wenn ich die Add-Linie getroffen.

Kann jemand in vereinfachender Weise einen Weg vorschlagen, wie ich das zum Laufen bringen kann?

+0

Normalerweise würden Sie 'ref Invoice' in C# schreiben. Ich nehme an, Sie verwenden C# Version 4. Nichts anderes ist offensichtlich, es mag einfach nicht, dass CUIInvoice ein Elternteil ist. Vielleicht wegen "UI". –

+0

Hallo Hans, danke für deine Antwort. Wenn ich das Invoice-Objekt mit ref übergebe, habe ich tatsächlich einen Compiler-Fehler - was ein Hinweis für diejenigen mit mehr Wissen sein kann: kann nicht von 'ref UIInvoice.CUIInvoice' in 'ref-Objekt' umgewandelt werden. Wenn ich einen statischen Objekttyp wie im Objekt temp = Invoice deklariere; und pass temp in by ref, bekomme ich den gleichen Typ Mismatch-Fehler. – user529703

+0

Was ist der Unterschied zwischen UIInvoice und CUIInvoice? Was passiert, wenn Sie Rechnung wie folgt deklarieren: CUIInvoice Invoice = new CUIInvoice() ;? –

Antwort

0

Meine Empfehlung wäre, mit COM nicht herumzualbern, aber den VB6-Code zu Visual Basic.NET zu migrieren. Sie werden viel weniger Probleme haben, Objekte mit C# zu ordnen. Wenn dieses Objekt mit anderen Legacy-Anwendungen geteilt wird, können Sie möglicherweise einen COM-Wrapper erstellen, der auch Ihre Legacy-Kompatibilität beibehält. Natürlich müssen Sie dies gegen Ihre geschäftlichen Anforderungen abwägen.

+0

mgnoonan, Vielen Dank für Ihren Kommentar. Ich glaube, du hast Recht. Ich hatte gehofft, die Idee der Migration des Codes kurz zu machen - es ist zu groß. Dies könnte ein guter Grund sein, den Prozess zu starten. – user529703

+0

Das ist normalerweise, wie es anfängt, aber am Ende kommt man mit mehr Problemen und Bandage-Lösungen als wenn Sie graben und die Migration machen. Auf lange Sicht sind Sie besser dran. – mgnoonan

0

Wenn Sie die VB6-Quelle besitzen, schlage ich vor, die Definition von Add ByVal anstelle von ByRef zu ändern. Es gibt fast nie einen Grund, ByRef Objektreferenzen in VB6 zu verwenden, und von dem winzigen Bit, das ich aus Ihrem Code entnehme, müssen Sie keine Paranet/Child-Beziehungen in Ihren Domain-Objekten zuordnen.