2010-04-07 34 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