Übergeben eines C # -Klassenobjekts in und aus einer C ++ - DLL-Klasse

8

Ich habe an einer Prototypcodeanwendung gearbeitet, die in C # ausgeführt wird und Klassen und Funktionen aus älterem C ++ - Code (in Form einer importierten DLL) verwendet. Die Codeanforderung besteht darin, ein Klassenobjekt an die nicht verwaltete C ++ - DLL (von C #) weiterzuleiten und es für den späteren Abruf durch die C # -Anwendung speichern / ändern zu lassen. Hier ist der Code, den ich bisher habe ...

Einfache C ++ - DLL-Klasse:

%Vor%

C ++ DLL-Funktionen:

%Vor%

C # Klasse und Wrapper:

%Vor%

C # Funktion Aufruf an DLL:

%Vor%

Nichts als Junk-Werte scheinen in der DLL verfügbar zu sein (von dem übergebenen C # -Objekt kommend). Ich glaube, ich vermisse etwas mit dem Marshalling oder einem Speicher / Zeiger-Problem. Was vermisse ich?

Bearbeiten: Ich habe den obigen Code geändert, um Änderungen an den Methoden / Funktionsdefinitionen in C # / C ++ widerzuspiegeln, die von Bond vorgeschlagen wurden. Der übergebene Wert (1234) wird jetzt vom C # -Code korrekt abgerufen. Dies hat ein anderes Problem in der C ++ DLL offen gelegt. Der 1234-Wert ist für den C ++ - Code nicht verfügbar. Stattdessen hat das Objekt in der DLL den Wert 0. Ich möchte vordefinierte C ++ - Funktionen verwenden, um das Objekt innerhalb der DLL zu bearbeiten. Jede weitere Hilfe wird sehr geschätzt. Danke!

    
notsodev 20.06.2012, 16:23
quelle

3 Antworten

5

Bond war korrekt, ich kann ein Objekt nicht zwischen verwaltetem und nicht verwaltetem Code übergeben und behält trotzdem seine gespeicherten Informationen.

Am Ende habe ich einfach C ++ - Funktionen aufgerufen, um ein Objekt zu erstellen und den Zeiger zurück in den IntPtr-Typ von C # zu geben. Ich kann dann den Zeiger zu irgendeiner C ++ Funktion weiterleiten, die ich benötige (vorausgesetzt, es ist extern) von C #. Dies war nicht genau das, was wir tun wollten, aber es wird seinen Zweck in dem Maße erfüllen, in dem wir es brauchen.

Hier ist C # der Wrapper, den ich für Beispiel / Referenz verwende. (Hinweis: Ich verwende StringBuilder anstelle des 'int intTest' aus meinem obigen Beispiel. Das ist, was wir für unseren Prototyp wollten. Ich habe einfach eine Ganzzahl im Klassenobjekt verwendet.):

%Vor%

Natürlich führt C ++ alle notwendigen Änderungen durch und die einzige Möglichkeit, auf C # zuzugreifen, besteht mehr oder weniger darin, die gewünschten Inhalte über C ++ anzufordern. Der C # -Code hat auf diese Weise keinen Zugriff auf die nicht gemanagten Klasseninhalte, so dass es ein wenig länger dauert, an beiden Enden zu codieren. Aber es funktioniert für mich.

Dies sind die Referenzen, die ich verwendet habe, um die Basis meiner Lösung zu finden: Ссылка

Hoffentlich kann dies einigen anderen helfen, mehr Zeit zu sparen, als ich versucht habe, es herauszufinden!

    
notsodev 10.07.2012, 13:20
quelle
4

Ich glaube, du solltest deine Methode wie folgt deklarieren

%Vor%

und der C # -Prototyp

%Vor%

Die eingehende Methode sollte auch einen Zeiger auf CClass nehmen, der C # -Prototyp ist in Ordnung.

    
Bond 20.06.2012 16:51
quelle
0

Wenn Sie die Klasse nur aus C # verwenden, sollten Sie GCHandle für das Ссылка

bearbeiten:

%Vor%     
user629926 20.06.2012 16:50
quelle