這個問題指的是「新」 d數組: DMD32 d編譯v2.068.2與d接口正確返回結構
爲TL; DR,如果你不需要細節跳過下面
與Visual Studio(我使用V2010)工作,通過創建一個new project
問題 - >D
- >Dynamic Library
當項目creartion過程完成後,在解決方案資源管理 有2個文件:
- dllmain.d
- dll.def
離開.def
文件,因爲它是我成功要明白, 通過添加一些新的功能到dllmain.d
與prefexing:
extern (Windows) export
將導出的功能,它會調用從c#
,不與C
或C++
嘗試。
側面說明,不要觸摸任何現有代碼的,除非你知道自己在做什麼。
所以下面的代碼按預期工作
extern (Windows) export uint D_mathPower(uint p)
{
return p * p;
}
從C#與以下簽名調用它:
[DllImport(@"pathTo...\DynamicLib1.dll", CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurity]
public static extern uint D_mathPower(uint p);
如下,我可以輕鬆使用它:
uint powD = D_mathPower(5);
我的問題是
我如何返回結構的數組(優選最經濟有效的方式)?
struct dpack{ char* Name; uint Id; }
我已經嘗試使用這兩種char[]
和char*
,但沒有成功。
這是我到目前爲止的代碼
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陣列到另一種語言可以工作,但通常不會因爲ABI細節不一定匹配。嘗試使用自己的指針和長度來爲interop創建結構類型,或者執行像getArray(size_t * lengthPtr,dpack ** ptrPtr){* lengthPtr = array.length; * ptrPtr = array.ptr; }' –
您應該練習創建一個C DLL並在C#中使用它,然後使用D DLL進行嘗試。弄清楚如何使用從C#返回「數組」的C函數,然後在D中使用相同的技術.C#不知道D如何存儲切片,因此您將無法按原樣使用它們。 –