Gibt ein Perl-Objekt aus einer anderen Perl-Klasse mit PerlNET an C # zurück

9

Ich habe zwei Perl-Module, die ich als Objekttypen für C # bereitstellen möchte. Einer von ihnen konstruiert Objekte des anderen Typs und gibt sie mit einer Methode wie unten gezeigt zurück. Ich schließe einen Verweis auf Type2.dll in Type1.dll ein, und referenziere beide in C #. Wie der Code zeigt, kann ich ein Type2-Objekt direkt aus C # konstruieren, aber ich kann kein Type2-Objekt zurückgeben, das von einer Methode in Type1 erstellt wurde. Irgendwelche Ideen?

(Cross-gepostet von Ссылка )

C #:

%Vor%

Perl: Typ1.pm

%Vor%

Perl: Typ2.pm

%Vor%     
DougWebb 21.04.2010, 18:08
quelle

2 Antworten

2

Da dies auf community.activestate.com und wurde dort beantwortet, ich werde die Antwort von dort nach hier kopieren, aber ich werde es abschneiden, weil ich denke, dass es zu lang ist.

Das Hauptproblem besteht darin, dass die Art und Weise, wie Sie es geschrieben haben, Type2 nicht als -Typ betrachtet wird und Aufruf von Type2->new() nicht in einen Konstruktoraufruf übersetzt wird (sondern in einen statischen Methodenaufruf).

Die folgenden Änderungen an Ihrem Code beheben dies:

  • Ändern Sie in Type2.pm package Type2 in package Sample::Type2 . Dies macht Type2 zu einem Typ und Sample einen Namespace.
  • Ändern Sie in Type1.pm ebenfalls package Type1 in package Sample::Type1 .
  • Ändern Sie in Type1.pm use Type2; in use namespace "Sample"; . Dies importiert Typ2 als -Typ .

Der veröffentlichte C # -Code funktioniert nach diesen Änderungen wie erforderlich.

    
Timwi 10.05.2010 16:28
quelle
1

Ich habe auch festgestellt, dass ich eine Datei wie folgt erstellen kann:

%Vor%

Dann sind meine Type1.pm und Type2.pm Dateien die gleichen wie zuvor, aber ohne die Schnittstelle POD. Mit diesem Setup erstellt plc eine einzelne DLL, die beide Klassen enthält, und die Type1-Klasse kann Instanzen von Type2 erstellen und zurückgeben.

Dies stellte sich als praktischer für mich heraus, da meine Type1- und Type2-Klassen Teil einer Legacy-Bibliothek sind, die ich für C # -Code bereitstellen möchte, ohne umfangreiche .NET-spezifische Änderungen an ihnen vornehmen zu müssen. Ich habe eine PM-Datei für meine C # -Assembly erstellt und darin die Schnittstellendefinitionen für den Zugriff auf die Legacy-Bibliotheksmethoden und eine Reihe .NET-spezifischer Methoden für Eigenschaften und die Konvertierung komplexer Perl-Hash- / Array-Datenstruktur-Rückgabewerte in eingefügt Hashtable und Array / ArrayList Datenstrukturen.

    
DougWebb 10.05.2010 21:12
quelle

Tags und Links