这个问题指的是“新” 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如何存储切片,因此您将无法按原样使用它们。 –