diese Frage zurückkommen wird, um die 'neuen' D verweisen: DMD32 Dmit D Schnittstelle richtig ein Array von Struct
für TL v2.068.2 Compiler; DR, wenn Sie Details brauchen nicht überspringen auf die Frage, unter
mit Visual Studio arbeiten (i v2010 verwende), durch eine new project
Erstellung ->D
->Dynamic Library
, wenn das Projekt Creartion Prozess abgeschlossen ist, in der Lösung Explorer gibt es zwei Dateien:
- dllmain.d
- dll.def
die .def
Datei zu verlassen, wie es ist, ich habe es geschaffen, zu verstehen, dass durch Hinzufügen neuer Funktionen zum dllmain.d
und prefexing mit:
extern (Windows) export
exportiert die Funktion und kann von c#
aufgerufen werden, nicht mit C
oder C++
.
Seitennotiz, berühren Sie keinen der vorhandenen Code, wenn Sie nicht wissen, was Sie tun.
so der Code funktioniert wie unten
extern (Windows) export uint D_mathPower(uint p)
{
return p * p;
}
erwartet es von C# mit der folgenden Signatur Aufruf:
[DllImport(@"pathTo...\DynamicLib1.dll", CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurity]
public static extern uint D_mathPower(uint p);
ich einfach es verwenden könnte wie folgt:
uint powD = D_mathPower(5);
meine Frage ist
Wie gebe ich ein Array von Strukturen zurück (vorzugsweise die kostengünstigste Methode)?
struct dpack{ char* Name; uint Id; }
i verwendet haben versucht, beide char[]
und char*
aber ohne Erfolg.
ist dieser Code meine bisher
extern (Windows) export
dpack[] D_getPacks(uint size)
{
dpack[] rtDpArr = new dpack[size];
char[] str = "someText".dup;
for(uint i=0; i<size; i++)
{
str[$ - 1] = cast(char)('0' + i % (126 - '0'));
rtDpArr[i].Id = i;
rtDpArr[i].Name= str.dup;
}
return rtDpArr;
}
void getPacksPtr(uint size, dpack** DpArr)
{
// this is the signature i have successfully implemented via c++
}
D-Arrays in eine andere Sprache zurückkehren kann funktionieren, aber in der Regel nicht der Fall ist, weil die ABI Details nicht unbedingt übereinstimmen. Versuchen Sie, Ihren eigenen Strukturtyp mit Zeiger und Länge für das Interop zu erstellen oder machen Sie etwas wie 'getArray (size_t * lengthPtr, dpack ** ptrPtr) {* lengthPtr = array.length; * ptrPtr = array.ptr; } ' –
Sie sollten üben, eine C-DLL zu erstellen und in C# zu verwenden, bevor Sie es mit einer D-DLL versuchen. Finden Sie heraus, wie C-Funktionen verwendet werden, die "Arrays" aus C# zurückgeben, und verwenden Sie dieselbe Technik in D. C# hat keine Kenntnis davon, wie D Slices speichert, so dass Sie sie nicht so verwenden können, wie sie sind. –