【发布时间】:2011-09-29 18:29:20
【问题描述】:
我想在 C# 中为布尔数组实例化内存,并使用互操作将其传递给 C 库函数。然后 C 函数应该用数据(结果)填充数组,以便数据可以传回 C# 并在那里使用。由于数组是引用类型,而且我为数组明确设置了 [In, Out] 编组属性,我认为这将是小菜一碟。但显然不是。 :-( 下面是一些说明问题的测试代码(尽可能简单)。
在 C 中,我会这样称呼:
extern "C" __declspec(dllexport) int __stdcall TestFillArray(bool *resultMaterials, int materialLength);
__declspec(dllexport) int __stdcall TestFillArray(bool *resultMaterials, int materialLength)
{
resultMaterials[0] = true;
resultMaterials[1] = true;
return materialLength;
}
我使用以下声明从 C# 调用此函数:
[DllImport("FrontAuction2.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
public static extern int TestFillArray([MarshalAs(UnmanagedType.LPArray, SizeConst = 2), In, Out] bool[] resultMaterial, int materialLength);
然后在我的 C# 测试方法中,我有:
var resultMaterials = new bool[2];
var res = TestFillArray(resultMaterials, 2);
当我检查结果时,我得到 res=2 和 resultMaterials[0] = true,并且 resultMaterials[1] = false。 IE。 res 值和第一个数组元素一样正确,但不是第二个。因此,布尔数据似乎没有正确编组(除非我遗漏了一些明显的东西)。
我猜也可以声明一个 IntPtr 而不是一个数组,并成功地将这两个元素编组为正确的结果。但是,由于我希望在 C# 中将数组分配到内存中,因此我不确定如何执行此操作。
非常感谢这方面的帮助。我有点卡在这里。 :(
更新:我猜这是因为布尔值只有 1 个字节长,而 C# 代码没有得到这个信息。那么如何指定呢?
【问题讨论】:
标签: c# c arrays interop boolean