我从C#调用C ++函数。作为参数,它接收一个指向结构数组的指针。
struct A
{
int data;
}
int CFunction (A* pointerToFirstElementOfArray, int NumberOfArrayElements)
在C#中,我创建了相同的结构(作为类),并且我正确地编组它(正确接收数组中的第一个元素)。这是我对C ++结构的C#定义:
[StructLayout(LayoutKind.Sequential), Serializable]
class A
{
int data;
}
第一个元素被正确读取,所以我知道结构中的所有字段都被正确编组。当我尝试发送元素数组时会发生此问题。 如何创建将在单个内存块(块)中的类数组,因此C ++函数可以将指针递增到数组?
我想我需要类似于stackalloc的东西,但是我相信它只适用于原始类型?
感谢您的帮助。
答案 0 :(得分:0)
这不是一个明确的答案,但仅仅是一个例子,您可以使用stackalloc
和不安全的代码来完成此任务。
public unsafe class Example
{
[DllImport("library.dll")]
private static extern int CFunction(A* pointerToFirstElementOfArray, int NumberOfArrayElements);
public void DoSomething()
{
A* a = stackalloc A[LENGTH];
CFunction(a, LENGTH);
}
}
另外,请注意API接受的结构的打包。您可能必须使用Pack
属性的StructLayout
属性。我相信默认值是4,但有些API需要1。
修改强>
为此,您必须将A
的声明从类更改为结构。
public struct A
{
public int data;
}