câu hỏi này được đề cập đến 'mới' D: DMD32 D Compiler v2.068.2interfacing với D đúng trả về một mảng của Struct
cho TL; DR nếu bạn không cần phải chi tiết skip cho câu hỏi dưới đây
làm việc với visual studio (tôi đang sử dụng v2010), bằng cách tạo ra một new project
->D
->Dynamic Library
khi quá trình creartion dự án hoàn tất, trong cửa sổ solution explorer có 2 file:
- dllmain.d
- dll.def
bỏ tập tin .def
như nó có, tôi đã được quản lý để hiểu rằng bằng cách thêm một số chức năng mới vào dllmain.d
và prefexing với:
extern (Windows) export
sẽ xuất các chức năng và nó sẽ được gọi từ c#
, đã không thử nó với C
hoặc C++
.
lưu ý phụ, không chạm vào bất kỳ mã hiện có nào trừ khi bạn biết mình đang làm gì.
để mã dưới đây làm việc như mong đợi
extern (Windows) export uint D_mathPower(uint p)
{
return p * p;
}
gọi nó từ C# với các chữ ký sau:
[DllImport(@"pathTo...\DynamicLib1.dll", CallingConvention = CallingConvention.StdCall), SuppressUnmanagedCodeSecurity]
public static extern uint D_mathPower(uint p);
tôi dễ dàng có thể sử dụng nó như sau:
uint powD = D_mathPower(5);
câu hỏi của tôi là
làm cách nào để tôi trả lại một mảng cấu trúc (tốt nhất là cách tiết kiệm chi phí nhất)?
struct dpack{ char* Name; uint Id; }
tôi đã thử sử dụng cả hai char[]
và char*
nhưng không thành công.
đây là mã của tôi cho đến nay
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++
}
trở về mảng D để một ngôn ngữ có thể làm việc nhưng thường không vì các chi tiết ABI sẽ không nhất thiết phải phù hợp. Hãy thử tạo kiểu struct của riêng bạn với con trỏ và chiều dài cho interop hoặc làm một cái gì đó như 'getArray (size_t * lengthPtr, dpack ** ptrPtr) {* lengthPtr = array.length; * ptrPtr = array.ptr; } ' –
Bạn nên thực hành tạo một DLL C và sử dụng nó trong C# trước khi thử nó với một D DLL. Tìm hiểu cách sử dụng các hàm C trả về "mảng" từ C#, sau đó sử dụng kỹ thuật tương tự trong D. C# không có kiến thức về cách D lưu trữ lát, vì vậy bạn sẽ không thể sử dụng chúng như là. –