是否可以将结构列表从C ++传递给C#

时间:2019-05-09 15:42:33

标签: c# c++ .net com-interop

我有兴趣从我的C ++代码中调用.NET代码。 .NET代码放入使用“ 生成COM可见”编译的单独的dll中,它包含一个接受“ item”结构列表的方法。

类似这样的东西:

struct item {
  int a;
  int b;
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public interface Ifoo {
    int GetFoo(ref IntPtr items,int nItems);
}

public class foo : Ifoo {
    int GetFoo(ref IntPtr items,int nItems) 
    {
        for (int ix = 0; ix < numMatches; ix++)
        {
            it = (item)Marshal.PtrToStructure((IntPtr)((long)items + Marshal.SizeOf(typeof(item))*ix)),typeof(item));
        }
    }
}

在c ++部分,我有类似的东西。

std::vector<struct> foo;
foo.push_back(stru1); // stru1 is initialized anywhere...
foo.push_back(stru2); // and so on...

netInstance->GetFoo(reinterpret_cast<long*>(foo.data()),foo.size());

但是这不起作用..我得到的只是内存异常。

我还尝试了其他方法,例如SAFEARRAY,但似乎不适用于自定义结构。

谢谢!

2 个答案:

答案 0 :(得分:0)

在Windows上,long可以是32位整数。您可以尝试在C ++代码中将long*更改为long long*,以使数组的大小与数据的大小匹配。

答案 1 :(得分:0)

您同时控制C#部分和C ++部分吗?而不是编组数组,而是更改接口以处理单个项目。调试会更容易。