6

C# プログラムからアクセスする必要がある ac .dll を開発しています。理想的には、.dll は C# で定義された構造体を受け取り、それに対して何らかの処理を行う必要があります。したがって、最初は、C dll の構造体の型とサイズは不明です。Cのextern関数で構造体を渡すことができたので、問題なく受信できるはずなのですが、この受信構造体の大きさや特徴を知る方法はありますか?そのメンバーを反復処理する方法はありますか?

これは、dll 用に定義された C 関数です。

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#コードです

 [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# ではすべての型が String であり、そのままであることが想定されているため、渡される構造体について私が知っているのはこれだけです。

何か案が?

前もって感謝します

4

1 に答える 1