【发布时间】:2017-01-23 17:14:45
【问题描述】:
我正在尝试在 Windows CE 程序和紧凑框架 2.0 上将以下结构从 c++ 编组到 c#。我在编组字符串时遇到了很多困难。
我有这个 c++ 代码:
#define Console_Parameters_MAX 50
struct AllParameters {
Parameter Parameters[Console_Parameters_MAX];
} ;
struct Parameter {
int Index;
int Id;
char Value[20];
};
extern "C" {
BOOL GetAllConsoleParameters(AllParameters *pItem);
}
这是对应的c#代码:
[StructLayout(LayoutKind.Sequential)]
public struct AllParameters {
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
public Parameter[] Parameters
}
[StructLayout(LayoutKind.Sequential)]
public struct Parameter {
public int Index;
public int Id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public byte[] Value;
}
[DllImport("exemple.dll", SetLastError = true)]
public static extern bool GetAllConsoleParameters([MarshalAs(UnmanagedType.Struct)] ref AllParameters pItem);
这就是我调用它的方式:
AllParameters item = new AllParameters();
if (AppAPI.GetAllConsoleParameters(ref item)) {
var array = item.Parameters;
}
当我调用 GetAllConsoleParameters 时,我得到了 NotSupportedException 异常。我尝试了很多配置,但都没有成功。
谁能建议如何实现它?
提前致谢
【问题讨论】:
-
异常的信息是什么?
-
字符串是一个类,不等同于字符数组。 IN c++ 字符数组以 '\0' 结束。所以在 c# 中使用 byte[] 而不是 char 数组。
-
我已经有一段时间没有使用 C++了,但我很确定
char []和string[]是不等价的。我认为您可能只希望在您的 c# 代码中使用string。 -
@jdweng 字符串仍然被编组
-
对不起字节非字符串...复制错误...
标签: c# c++ arraylist compact-framework marshalling