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関数でありますそのように残っているので、渡される構造体について私が知っているのは唯一のことです。
事前
C#で定義されている構造体を受け取る必要があります "*? C++とC#は静的型言語です。だから両方のコンパイル時にすべての型が分かっています。さらに、両側の型の定義は一貫している必要があり、マーシャリングは問題なく実行できます。 – Nawaz
私は 'sizeof'演算子はあなたが思うとは思わないと思います。 poinerのサイズが4バイト(32ビットマシン上)なので、 'sizeof(Test)'は4を返します。これはTestに4つの項目があることを意味するものではありません。 – PoByBolek
@PoByBolek - この「単純な」説明を想像できないので、このコードが何をしているのか理解できませんでした。 – SChepurin