2013-08-02 14 views
6

C#プログラムからアクセスする必要があるc .dllを開発しています。理想的には、.dllはC#で定義された任意の構造体を受け取り、何かを行う必要があります。だから、最初は、構造体の型とサイズは、C DLLで不明です。私は構造体をC extern関数に渡すことができました。これは問題なく受け取り可能ですが、この受信構造体のサイズと特性を調べる方法はありますか?そのメンバーを反復する方法はありますか?未知のC構造体を継承したC#

これは、これはC#コード

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] 
unsafe public struct myStruct{ 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value1; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value2; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value3; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value4; 
}; 

[DllImport("SMKcomUploadDLL.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int testCSharp(ref myStruct message); 

static void Main() 
{ 
    int result; 

    myStruct message = new myStruct(); 

    message.value1 = "Some randome string"; 
    message.value2 = "0"; 
    message.value3 = "olkujhikvb"; 
    message.value4 = "isabedfbfmlk"; 

    result = testCSharp(ref message); 
} 

すべての種類がC#で文字列であり、そしてそれがsuppossedあるDLL用

extern int __cdecl testCSharp(mystruct * Test){ 

//sizeof(Test) is 4, so it is ok 

for(int i=0;i < sizeof(Test) ; i++){ 

    char * value = (char*) Test; //This access the first element. 
    cout << value << endl; //Prints "some random string", so, it is received ok 
} 

return 1; 

}

を定義C関数でありますそのように残っているので、渡される構造体について私が知っているのは唯一のことです。

事前

+0

C#で定義されている構造体を受け取る必要があります "*? C++とC#は静的型言語です。だから両方のコンパイル時にすべての型が分かっています。さらに、両側の型の定義は一貫している必要があり、マーシャリングは問題なく実行できます。 – Nawaz

+2

私は 'sizeof'演算子はあなたが思うとは思わないと思います。 poinerのサイズが4バイト(32ビットマシン上)なので、 'sizeof(Test)'は4を返します。これはTestに4つの項目があることを意味するものではありません。 – PoByBolek

+0

@PoByBolek - この「単純な」説明を想像できないので、このコードが何をしているのか理解できませんでした。 – SChepurin

答えて

2

おかげであなたは100の長さでByValTStrとしてそれらを整列化しているとして、私はあなたが任意のより多くのあなたがすでに(つまり、最初の要素を持っているものよりもどんな仕事することができるでしょうか分かりません)。 MSDN(here

.NET FrameworkのByValTStrタイプから

は([5]例えば、チャーS)

構造内部 Cスタイル、固定サイズの文字列のように振る舞います

LPStrまたはLPWStrヌルターミネーションを使用した場合は、長さを調整することができます。