【发布时间】:2012-04-25 17:10:01
【问题描述】:
所以,这个问题有很多变种,看了几个还是想不通。
这是 C 代码:
typedef struct
{
unsigned long Identifier;
char Name[128];
} Frame;
Frame GetFrame(int index);
这是 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);
这是我在 C# 中尝试的最后一次尝试,看起来很合乎逻辑,但我收到错误“方法的签名与 PInvoke 不兼容”。所以,我有点不知道下一步该尝试什么。任何帮助表示赞赏。
谢谢, 凯文
已更新 Kevin 将此作为编辑添加到我的回答中
我应该改为更改我的 C 代码:
void GetFrame(int index, Frame * f);
并用于 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);
【问题讨论】:
-
函数定义存在。列出的 C 代码仅来自头文件。
-
我看到并尝试了 private static extern IntPtr GetFrame(int index);但调用会引发错误“尝试读取或写入受保护的内存。”