2016-04-22 15 views
2

私は新しいC#ユーザーです。私はC#プロジェクトに以下で使用する場合、しかしC#でのStruct Arrayの使い方

[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;  
    } 

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#を使用します。私は、以下のC/C++の構造体を持っている

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

コンプライアー出力:

エラー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でDiagnosticsオブジェクトへのポインタを宣言すると、GCは新しい参照を認識せず、後でオブジェクトを使用している間にそのオブジェクトを破棄することができます。

絶対に使用する必要がない限り、私は個人的にポインタをクリアするように修正します。あなたの全体的なプログラムが何であるか分かりませんが、単純に参照を渡したければ、OutResultを値型(struct)ではなく参照型(クラス)にしてください。 C#は管理された言語なので、管理されたコンテキストに常に挑戦するのが最善です。

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

ありがとうございました!最後に、私はこの問題を解決するためにCOMを使いました! – halolzx

関連する問題