【发布时间】:2011-01-17 00:28:54
【问题描述】:
我正在尝试调用一个非托管 C++ 函数,该函数具有一个结构作为输入参数。 该结构在头文件中定义如下:
struct MyStruct
{
int siOrder;
char aaszNames[6][25];
int siId[6];
int siTones[6];
};
我尝试将托管结构声明如下:
[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct MyStruct {
public int siOrder;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=150)]
public string aaszNames;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=6, ArraySubType=UnmanagedType.I4)]
public int[] siId;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=6, ArraySubType=UnmanagedType.I4)]
public int[] siTones;
}
但没有任何成功。我猜测编组失败了,因为 aaszNames 实际上是一个由六个 25 长的空终止字符串组成的数组。 我尝试将 aaszNames 声明为
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=150)]
public char[] aaszNames;
在必要时用空值填充数组。但是,再一次,什么都没有。
我有什么遗漏吗?我哪里错了?编组这个二维字符数组的最佳方法是什么?
任何提示,请。
【问题讨论】:
-
一点也不像 C++...
-
他想从C#调用一个C++函数
-
我添加了一个 C# 标签,希望能更清楚地了解其含义。在我拿到代码之前,我还认为这是一个纯 C++ 问题。
-
我认为 Matthieu 说你的非托管代码很像 C,并建议在 C++ 中使用 std::string 或类似的东西?
-
是的,我同意它有点像 C,但这是第三方 dll,将其称为 C++ dll 的文档很差……无法真正改变这个 dll。跨度>
标签: c# c++ struct multidimensional-array marshalling