2010-04-07 35 views
2

嘿,我想打电话给在C#中的非托管C++代码 功能界面中,就像下面的(我简化,它可以很容易地理解)调用非托管C++代码与STL混合

Face genMesh(int param1, int param2); 

脸型一个结构定义为:

struct Face{ 
    vector<float> nodes; 
    vector<int> indexs; 
} 

我用Google搜索和阅读MSDN文档中发现的方式来调用简单的C/C++ unmanged在C#代码,也知道如何到手的结构作为返回值。而我的问题是如何处理“矢量”。我没有找到有关C#中的矢量和某些类型之间的映射的规则。

谢谢!

+0

此搜索帮助您:[网站:msdn.microsoft.com/ STL .Net](http://www.google.com/webhp?hl=zh-CN#hl=zh-CN&source=hp&q=site%3Ahttp% 3A%2F%2Fmsdn.microsoft.com%2F + STL + .Net&aq = f&aqi =&aql =&oq =&gs_rfai =&fp = a2bb30ecf4f91972) – lsalamon 2010-04-09 14:27:10

回答

0

可能最简单的做法是在C++中创建一个托管类来表示'Face'结构并将其内容复制到新的托管类中。你的C#代码应该能够理解数据。

您可以使用ArrayList来代替载体。

0

你可能需要传递原始数组,除非你真的想用interop来跳过一些箍筋,因为规则指定的类型必须可以被框架绑定,或者你已经给出了框架它可以编组一个特定的结构。这可能不适用于载体。所以,你可以定义你的C++结构作为

#pragma pack(push, 8) 
struct ReflSettings 
{ 
double* Q; 
    double* DisplayQ; 
} 
#pragma pack(pop) 

那么C#结构将

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 8)] 
    public class ModelSettings:IDisposable 
    { 

     [XmlIgnore] internal IntPtr Q; 
     [XmlIgnore] internal IntPtr DisplayQ; 
    } 

希望这有助于。

1

如果可能的话,您希望避免在纯粹的UN- UNDERSED代码中使用STL。当您将它与C++/CLI(或Managed C++)混合使用时,您最终可能会以STL代码的形式运行,并且客户端代码以非托管形式运行。发生的情况是,当你迭代一个向量时,每次调用向量方法都会转换为托管代码并返回。

请参阅here对于类似的问题。

+0

但是,非托管代码是第三部分dll。除了C++/CLI之外,还有其他的 – 2010-04-08 07:12:49

+0

STL本身性能相当差。 – gbjbaanb 2010-11-12 21:30:33