嘿,我想在C#中调用非托管c ++代码 功能界面如下(我简化它以使其易于理解)
Face genMesh(int param1, int param2);
Face是一个定义为:
的结构struct Face{
vector<float> nodes;
vector<int> indexs;
}
我用谷歌搜索并阅读了MSDN文档,找到了在C#中调用简单c / c ++非托管代码的方法,也知道如何将结构作为返回值。我的问题是如何处理“矢量”。我没有在C#
中找到关于vector和某些类型之间映射的规则谢谢!
答案 0 :(得分:1)
如果可能,您希望避免在纯粹的非托管代码中使用STL。当您将其与C ++ / CLI(或托管C ++)混合使用时,您可能最终将STL代码作为托管运行,并将客户端代码作为非托管运行。会发生的是,当您迭代一个向量时,对向量方法的每次调用都将转换为托管代码并再次返回。
有关类似问题,请参阅here。
答案 1 :(得分:0)
最简单的事情可能是在C ++中创建一个托管类来表示'Face'结构并将其内容复制到新的托管类中。然后,您的c#代码应该能够理解数据。
您可以使用ArrayList代替矢量。
答案 2 :(得分:0)
你可能需要传递原始数组,除非你真的想通过interop跳过一些箍,因为规则指定类型必须由框架构成,或者你给了框架一个它可以编组的具体结构。这可能是矢量无法实现的。因此,您可以将C ++ struct定义为
#pragma pack(push, 8)
struct ReflSettings
{
double* Q;
double* DisplayQ;
}
#pragma pack(pop)
那么你的C#struct将是
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)]
public class ModelSettings:IDisposable
{
[XmlIgnore] internal IntPtr Q;
[XmlIgnore] internal IntPtr DisplayQ;
}
希望这有帮助。