【问题标题】:How to marshall C++ struct array into C#如何将 C++ 结构数组编组为 C#
【发布时间】:2020-04-02 14:52:40
【问题描述】:

我打算将一个 c++ struct 数组编组到 c# 中,我尝试了很多方法来做到这一点,但函数返回的数组一直是一个空数组。我不知道问题是什么。 这是我的 C++ 代码:

# include<iostream>
typedef  struct
{
    float x, y, z;
}cfloat3;

extern "C" __declspec(dllexport)  cfloat3* Test();
extern "C" __declspec(dllexport)  void freeMemory(cfloat3 * a);

cfloat3* Test()
{
    cfloat3* a = new cfloat3[5];
    for (int i = 0; i < 5; i++)
    {
        a[i].x = 1;
        a[i].y = 1;
        a[i].z = 1;
    }
    return a;
}
void freeMemory(cfloat3* a)
{
    delete[] a;
}

这是我的 C# 代码

namespace ConsoleApp3
{
    [StructLayout(LayoutKind.Sequential)]
    struct cfloat3
    {
        public float x, y, z;
    }
    class Program
    {
        [DllImport("Dll1.dll", EntryPoint = "Test")]
        public static extern IntPtr Test();

        [DllImport("Dll1.dll", EntryPoint = "freeMemory")]
        public static extern void freeMemory( IntPtr a);
        static void Main(string[] args)
        {

            int length = 5;
            int size = Marshal.SizeOf(typeof(cfloat3)) * length;

            IntPtr pBuff = Marshal.AllocHGlobal(size);
            cfloat3[] pClass = new cfloat3[length];
            pBuff=Test();

            IntPtr[] bb = new IntPtr[length];
            Marshal.Copy(pBuff, bb, 0, length);

            for (int i = 0; i < length; i++)
            {
                pClass[i] = (cfloat3)Marshal.PtrToStructure(bb[i],typeof(cfloat3));

                Console.WriteLine(pClass[i].x);
                Console.WriteLine(pClass[i].y);
                Console.WriteLine(pClass[i].z);

            }
            Marshal.FreeHGlobal(pBuff);
            Console.ReadKey();
        }
    }
}

运行这个程序,我得到“System.AccessViolationException: Attempted to read or write protected memory. 这通常表明其他内存已损坏。”

【问题讨论】:

  • 如果C++负责分配和删除内存,管理内存是相当困难的。您能否更改 C++ 代码,以便将要填充的结构传递给它,而不是为其分配空间?
  • 我想尽可能避免更改 C++ 代码。我在c++代码中声明了一个freeMemory方法,可以在c#中调用,我认为可以解决内存空闲的问题。

标签: c# c++


【解决方案1】:

您需要在每个字段中使用MarshalAs 注释和SizeConst,并将C# 的返回类型单独映射到c++ 结构和返回类型

请参考这个答案Marshaling C++ struct to C#

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多