2011-05-18 72 views
2

我在我的項目中使用了C++中定義的以下結構體,這些結構體將被重新用於Unity引擎的C#腳本中的另一個項目。我希望將這些結構類型用作C#腳本和dll中C函數之間的參數類型,但我不知道如何將它們轉換爲C#聲明。什麼是在C++中定義的以下結構的C#

這裏有結構的定義:

struct SMove 
{ 
    std::string m_MotionID; 
    std::string m_AnimSrc; 
    float   m_StartFrame; 
    float   m_EndFrame; 

// features 

enum XFEATURE 
{ 
    XFEATURE_NONE = 0, 

    // Insert new features 
    XFEATURE_ENERGY,    
    XFEATURE_POWERLEVEL,    

}; 

float   m_Intensity; 
}; 

struct SElement 
{ 
    float   m_Start; 
    float   m_End; 
}; 
typedef std::vector<SElement> TElements; 

struct SGroup 
{ 
    float   m_Start; 
    float   m_End; 
    long   m_Level; 

    TElements  m_Elements; 
}; 
typedef std::vector<SGroup> TGroups; 

struct SDivision 
{ 
    std::string m_PlayerID; 
    std::string m_DivisionID; 
    float   m_Start; 
    float   m_End; 

    TGroups  m_Groups; 

    // features 
    float   m_Intensity; 

}; 
typedef std::vector<SDivision> TDivisions; 

typedef std::vector<long*>  TScript; 

struct SScriptList 
{ 
    TScript* m_Seg[9][4][2]; 
}; 

我剛開始學習C#,我知道它只能互操作使用C,因此所有的std :: string和std ::載體必須是莫名其妙的東西替換在C和C#中都可以識別。我知道std :: string可以用const char *替換,但是我怎麼去轉換其餘的?我搜索了很多網站,但找不到類似於我的任何示例。我如何在C#中的另一個結構中聲明結構數組,以及在SDivision和SGroup中的C等價物?

更新:

我已經轉換了一些結構到C如下:

struct SElement 
{ 
    float   m_Start; 
    float   m_End; 
}; 

struct SGroup 
{ 
    float   m_Start; 
    float   m_End; 
    long   m_Level; 

    //Array of Elements  
    SElement*  m_pElements; 
    int    m_numElements; 
}; 

struct SDivision { 
    const char*  m_PlayerID; 
    const char*  m_DivisionID; 
    float   m_Start; 
    float   m_End; 

    //Array of Groups 
    SGroup*  m_pGroups; 
    int    m_numGroups; 

    float   m_Intensity; 
}; 

什麼會生成C#是什麼?

+3

你想要什麼?你是否希望C#等價於結構,即有效的C#代碼?或者你想要有效的C或C++代碼,可以在P/Invoke中用於C#。這是兩件完全不同的事情! – 2011-05-18 07:57:36

+0

我想使用這些結構作爲從C DLL插件爲Unity C#腳本導入的函數的參數。我認爲這意味着我需要在腳本中的有效C#代碼和DLL項目中的等效C結構,但我不太確定,但是... – fisyher 2011-05-18 08:03:52

+3

您在結構中使用STL容器,沒有簡單的方法將它們編組到C#碼。你可能想用c數組替換它們。除此之外,一切都將變得簡單。 – Nekuromento 2011-05-18 08:06:58

回答

0

這裏的最佳做法是擁有C++/CLI橋接器DLL。 C++/CLI橋應該使用構建原始DLL的相同版本的Visual Studio構建。構建結果是普通的.NET庫。