【发布时间】:2012-09-16 05:38:01
【问题描述】:
背景信息
我在 C 中有一个函数,它返回一个 void*。
我开始测试两个项目之间的转换,将 true 或 false 分配给指针,回到 C# 中,我得到了 IntPtr,我使用了 IntPtr.ToPointer() 函数,然后将其转换为byte,根据我读到的,它相当于c#中的布尔值。
这对我来说效果很好。
DLLIMPORT:
[DllImport(Library.ruta,
SetLastError = true,
CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr test_boolean(int flag);
使用函数:
x = Library.test_boolean(1);
z = x.ToPointer();
Console.WriteLine("Prueba");
if (Convert.ToBoolean((byte)z))
Console.WriteLine("True");
else
Console.WriteLine("False");
问题
当我尝试做同样的事情但为指针分配一个布尔数组时,我无法在 C# 中恢复它。
这就是 C 中的函数的样子
...
vpointer *chromosome;
chromosome = s_malloc(2*sizeof(boolean *));
if (flag == 1)
{
chromosome[0] = true;
chromosome[1] = true;
}
...
Return chromosome;
我尝试在 C# 中做的事情:
(1) 我尝试了相同的“强制转换”,这次是字节数组。这给了我一个空引用异常:
if (Convert.ToBoolean(((byte*)z)[1]))
Console.WriteLine("True");
else
Console.WriteLine("False");
(2) 因为那不起作用,经过一番研究,我尝试了Marshal.Copy 函数,将我的指针复制到一个字节数组。尽管这一次我没有得到任何异常,但我没有得到正确的结果。我的意思是,例如,如果数组的第一个布尔值是假的,我就会得到真。
C# 代码如下所示:
x = Library.test_boolean(1);
byte [] managedArray = new byte[2];
Marshal.Copy(x, managedArray, 0, 2);
foreach (var qq in managedArray)
{
Boolean a = Convert.ToBoolean(qq);
Console.WriteLine(a.ToString());
}
问题
所以我的问题是将 C# 中的 IntPtr 转换为布尔数组的正确方法是什么?
【问题讨论】:
-
2*sizeof(boolean *));应该是 2*sizeof(boolean));
-
(谢谢)我刚刚更改了它,但我仍然在 C# 中一直出错
-
@Laggel 正如米奇指出的那样,布尔值,而不是布尔值*。您想要的数组应该适合两个布尔值,而不是两个指向布尔值的指针。不过,这不会是崩溃的原因。
-
@Laggel 能否添加
test_boolean函数的 DllImport/声明? -
@JoachimIsaksson 我刚刚添加了 dllimport。注意:在 C# 中,返回类型是
vpointer,这只是void*的自定义类型
标签: c# c arrays marshalling intptr