我有兴趣从我的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,但似乎不适用于自定义结构。
谢谢!
答案 0 :(得分:0)
在Windows上,long可以是32位整数。您可以尝试在C ++代码中将long*
更改为long long*
,以使数组的大小与数据的大小匹配。
答案 1 :(得分:0)
您同时控制C#部分和C ++部分吗?而不是编组数组,而是更改接口以处理单个项目。调试会更容易。