2016-04-22 134 views
2

我是一個新的C#用戶。我有一個C/C++結構如下:如何在C#中使用Struct數組#

typedef struct 
{ 
    float x; 
    float y; 
}Point2f; 

typedef struct 
{ 
    int id; 
    unsigned char charcode; 
}CharResultInfo; 

typedef struct 
{ 
    int strlength; 
    unsigned char strval[1024]; 
    CharResultInfo charinfo[1024]; 
}StringResultInfo; 

typedef struct 
{ 
    int threshold; 
    int polarity;       
    bool inverted; 
}Diagnotices; 

typedef struct 
{ 
    Point2f regioncenter;       
    StringResultInfo stringinfo; 
    Diagnotics diagnotics;     
}SingleOutResult; 

我使用C#定義相同的結構象下面這樣:

[StructLayoutAttribute(LayoutKind.Sequential)] 
public struct Point2f  
{ 
    public double x; 
    public double y; 
} 

[StructLayoutAttribute(LayoutKind.Sequential)] 
public unsafe struct DF_TAdvOCRCharResultInfo 
{ 
    public Int32 id; 
    public char charcode; 
} 

[StructLayoutAttribute(LayoutKind.Sequential)] 
public unsafe struct DF_TAdvOCRStringResultInfo 
{ 
    public int strlength; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 1024)] 
    public string strval; 
    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 1024, ArraySubType = UnmanagedType.Struct)] 
    public CharResultInfo[] charinfo; 
} 


[StructLayoutAttribute(LayoutKind.Sequential)] 
public unsafe struct Diagnotics 
{ 
    public Int32 polarity; 
    [MarshalAsAttribute(UnmanagedType.I1)] 
    public bool inverted; 
} 

[StructLayoutAttribute(LayoutKind.Sequential)] 
    public unsafe struct OutResult 
    { 
     public Point2f regioncenter; 
     public StringResultInfo stringinfo; 
     public Diagnotics diagnotics;  
    } 

然而,當我在C#項目下面使用:

OutResult *pResult = (OutResult *)inputparam; //inputparam input from C/C++ dll 

Complier輸出:

錯誤CS0208:無法取地址,得到的大小,或者聲明 一個指向託管類型(「***。OutResult」)

我的問題是,爲什麼結構指針不能使用,如何固定?

+0

我在C/C#互操作中沒有任何經驗。因此,讓我澄清一下:IIUC'StringResultInfo'類型是通過程序的C部分中的'typedef'聲明的。當你在'OutResult'中使用它作爲類型時,C#部分如何瞭解這個名稱?等價的C#類型看起來是'DF_TAdvOCRStringResultInfo'。 –

+0

這是我的錯,我忘了修改C#中的結構名稱; – halolzx

回答

2

指針不能指向引用或指向包含引用的結構,因爲即使指針指向它,對象引用也可能被垃圾回收。垃圾回收器不會跟蹤任何指針類型是否指向某個對象。

https://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

主要是因爲C#是它需要跟蹤,以便知道什麼時候GC它的對象的所有引用託管語言。如果您在OutResult中聲明指向診斷對象的指針,那麼GC將不會意識到新引用,並且可能在您使用它時處理對象。

爲了解決這個問題,我會親自避開指針,除非你絕對必須使用它們。我不知道你的整體程序是什麼,但如果你只是想傳遞引用,然後使OutResult引用類型(類)而不是值類型(結構)。 C#是一種託管語言,因此總是最好嘗試並堅持託管上下文,特別是如果您仍然是初學者,就像您說的那樣。

public class OutResult 
{ 
    public Point2f regioncenter; 
    public StringResultInfo stringinfo; 
    public Diagnotics diagnotics;  
} 
+0

非常感謝!最後,我用COM來解決這個問題! – halolzx