Vì vậy, đã có nhiều biến thể của câu hỏi này, và sau khi xem xét một số câu hỏi tôi vẫn không thể hiểu được.C# gọi hàm C trả về cấu trúc với mảng char có kích thước cố định
Đây là mã C:
typedef struct
{
unsigned long Identifier;
char Name[128];
} Frame;
Frame GetFrame(int index);
Đây là mã C#:
struct Frame
{
public ulong Identifier;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 128)]
public char[] Name;
}
[DllImport("XNETDB.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern Frame GetFrame(int index);
Đây là nỗ lực cuối cùng tôi đã cố gắng trong C#, và nó có vẻ khá hợp lý, nhưng tôi nhận được lỗi "Chữ ký của phương thức không tương thích với PInvoke". Vì vậy, tôi là loại mất về những gì để thử tiếp theo. Bất kỳ trợ giúp được đánh giá cao.
Cảm ơn, Kevin
Cập nhậtKevin nói thêm đây là một chỉnh sửa câu trả lời của tôi
tôi thay vì phải thay đổi mã C của tôi:
void GetFrame(int index, Frame * f);
và sử dụng thay thế cho C# :
struct Frame
{
public uint Identifier;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 128)]
public string Name;
}
[DllImport("XNETDB.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern void GetFrame(int index, ref Frame f);
Bạn có thấy điều này http://social.msdn.microsoft.com/Forums/en-AU/csharplanguage/thread/6e0ad208-5c8b-48ac-a45e-cfaf7f52221b? – MilkyWayJoe
Định nghĩa hàm tồn tại. Mã C được liệt kê chỉ từ tệp tiêu đề. –
Tôi thấy rằng và cố gắng tư nhân tĩnh extern IntPtr GetFrame (int index); nhưng gọi đó là ném lỗi "Đã cố đọc hoặc ghi bộ nhớ được bảo vệ". –