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:
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:
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%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% 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:
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.