Übergeben eines Vektors / Arrays von nicht verwaltetem C ++ an C #

8

Ich möchte 100 - 10.000 Punkte von einem nicht verwalteten C ++ nach C # weitergeben.

Die C ++ Seite sieht so aus:

%Vor%

Jetzt sieht meine C # -Seite so aus:

%Vor%

Wie muss ich meinen Code ändern, um den std :: vector aus nicht verwaltetem C ++ mit seinem gesamten Inhalt an C # zu übergeben?

    
nali 14.07.2015, 21:25
quelle

3 Antworten

11

Solange der verwaltete Code die Größe des Vektors nicht ändert, können Sie auf den Puffer zugreifen und ihn als Zeiger mit vector.data() (für C ++ 0x) oder &vector[0] übergeben. Dies führt zu einem Nullkopie-System.

Beispiel C ++ API:

%Vor%

Anrufer:

%Vor%     
Mitch 14.07.2015, 23:09
quelle
6

Ich habe dies mit C ++ - CLI-Wrapper implementiert. C ++ CLI ist einer der drei möglichen Ansätze für C ++ C # Interop. Die anderen zwei Ansätze sind P / Invoke und COM. (Ich habe ein paar gute Leute gesehen, die C ++ CLI gegenüber den anderen Ansätzen empfehlen)

Um Informationen aus nativem Code in verwalteten Code zu mappen, müssen Sie den nativen Code zunächst in eine von C ++ CLI verwaltete Klasse umbrechen. Erstellen Sie ein neues Projekt, das systemeigenen Code und seinen C ++ - CLI-Wrapper enthält. Stellen Sie sicher, dass Sie den /clr -Compilerschalter für dieses Projekt aktivieren. Erstellen Sie dieses Projekt in einer DLL. Um diese Bibliothek zu verwenden, fügen Sie einfach ihre Referenz in C # hinzu und tätigen Sie Aufrufe dagegen. Sie können das tun, wenn beide Projekte in der gleichen Lösung sind.

Hier sind meine Quelldateien für ein einfaches Programm, um eine std::vector<double> von nativem Code in C # verwalteten Code zu marshallen.

1) Projekt-EntityLib (C ++ CLI dll) (systemeigener Code mit Wrapper)

Datei NativeEntity.h

%Vor%

Datei NativeEntity.cpp

%Vor%

Datei ManagedEntity.h (Wrapper-Klasse)

%Vor%

Datei ManagedEntity.cpp

%Vor%

2) Projekt SimpleClient (C # exe)

%Vor%     
The Vivandiere 14.07.2015 23:08
quelle
5

Ich könnte mir mehr als eine Option vorstellen, aber alle beinhalten das Kopieren der Daten des Arrays. Mit [out] Parametern könnten Sie versuchen:

C ++ - Code

%Vor%

C # -Code

%Vor%     
Nikolay 14.07.2015 22:54
quelle

Tags und Links