questa domanda si riferisce al 'nuovo' D: DMD32 D Compiler v2.068.2interfacciamento con D correttamente restituire un array di Struct
per TL; DR se non è necessario Salta alla domanda qui sotto
lavorare con visual Studio (sto usando v2010), con la creazione di un new project
->D
->Dynamic Library
quando il processo del progetto creartion è completa, nella soluzione Explorer c'è 2 file:
- dllmain.d
- dll.def
lasciando il file .def
così com'è, sono riuscito per capire che con l'aggiunta di alcune nuove funzioni al dllmain.d
e prefexing con:
extern (Windows) export
esporterà la funzione e sarà richiamabile da c#
, non provato con C
o C++
.
nota a margine, non toccare nessuno dei codici esistenti a meno che non si sappia cosa si sta facendo.
in modo che il codice qui sotto funziona come previsto
extern (Windows) export uint D_mathPower(uint p)
{
return p * p;
}
chiamandolo da C# con la seguente firma:
[DllImport(@"pathTo...\DynamicLib1.dll", CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurity]
public static extern uint D_mathPower(uint p);
potrei facile usarlo come segue:
uint powD = D_mathPower(5);
la mia domanda è
Come restituire un array di strutture (preferibilmente il modo più conveniente)?
struct dpack{ char* Name; uint Id; }
ho provato utilizzando sia char[]
e char*
ma senza successo.
questo è il mio codice finora
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++
}
restituzione di array D per un altro linguaggio in grado di lavorare, ma di solito non perché i dettagli ABI non necessariamente corrispondere. Prova a creare il tuo tipo di struct con puntatore e lunghezza per l'interoperabilità o fai qualcosa come 'getArray (size_t * lengthPtr, dpack ** ptrPtr) {* lengthPtr = array.length; * ptrPtr = array.ptr; } ' –
È consigliabile esercitarsi nella creazione di una DLL C e utilizzarla in C# prima di provarla con una DLL D. Scopri come usare le funzioni C che restituiscono "array" da C#, quindi usa la stessa tecnica in D. C# non ha alcuna conoscenza di come D memorizzi le slice, quindi non sarai in grado di usarle così com'è. –