Schnittstelle mit D Richtig ein Array of Struct zurückgeben

8

Diese Frage bezieht sich auf das "neue" D: DMD32 D-Compiler v2.068.2

  

für TL; DR, wenn Sie keine Details benötigen, überspringen Sie die folgende Frage

arbeite mit Visual Studio (ich verwende v2010), indem ich ein new project - & gt; D - & gt; Dynamic Library

wenn der Projekt-Creation-Prozess im Solution Explorer abgeschlossen ist Es gibt 2 Dateien:

  • dllmain.d
  • dll.def

die Datei .def so lassen, wie sie ist, habe ich verstanden, dass Fügen Sie dem dllmain.d einige neue Funktionen hinzu und geben Sie mit:

eine Voreinstellung vor %Vor%

exportiert die Funktion und kann von c# aufgerufen werden, nicht mit C oder C++ .

Randnotiz, berühren Sie keinen vorhandenen Code, es sei denn, Sie wissen, was Sie tun.

Der folgende Code funktioniert also wie erwartet

%Vor%

ruft es von C # mit der folgenden Signatur auf:

%Vor%

Ich könnte es einfach wie folgt verwenden:

%Vor%

meine Frage ist

Wie gebe ich ein Array von Strukturen zurück (vorzugsweise die kostengünstigste Methode)?

%Vor%

Ich habe versucht, char[] und char* zu verwenden, aber ohne Erfolg.

das ist mein Code bisher

%Vor%     
Raj Felix 02.11.2015, 15:56
quelle

2 Antworten

1

Da ein D-Array ein spezielles Layout hat, sollten Sie lieber einen Zeiger auf das erste Element zurückgeben. Dann können Sie in C # jedes Element aus dem Basiszeiger umwandeln, indem Sie 8 Bytes pro 8 Bytes lesen (dies entspricht dpack.sizeof ), da Sie die Anzahl bereits kennen:

%Vor%

Um auch das .Name -Member zu erzeugen, muss ein Terminator hinzugefügt werden, ansonsten kann man die Länge des Strings nicht kennen. Dies geschieht durch std.string.toStringz , das am Ende der Zeichenfolge ein Nullzeichen hinzufügt. Das char* Name -Member kann dann umgewandelt werden, wie es normalerweise Zeichenfolgen sind, die von einer Funktion in einer DLL mit einer C-Schnittstelle bereitgestellt werden.

    
Abstract type 02.11.2015 20:26
quelle
0

Dies ist der effizienteste Weg, den ich implementieren könnte.

%Vor%

benutze es:

%Vor%     
Raj Felix 03.11.2015 03:04
quelle

Tags und Links