这个问题是关于“新”的D语言编译器的,具体为:DMD32 D Compiler v2.068.2
如果您不需要细节,请跳过下面的内容直接看问题。
在visual studio(我使用的是v2010)中创建一个新项目
,选择D
,然后选择动态库(Dynamic Library)
。
当项目创建完成后,在解决方案资源管理器中会出现两个文件:
- dllmain.d
- dll.def
保留.def
文件不变,通过向dllmain.d
添加一些新函数并以“:”为前缀,我已经理解了这一点。
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++
}
getArray(size_t* lengthPtr, dpack** ptrPtr) { *lengthPtr = array.length; *ptrPtr = array.ptr; }
- Adam D. Ruppe