一部の C++ コードをマネージド .NET に移植する作業を行っています。一部の C++ コードをネイティブ形式で保持する必要があり、それに対して IJW アプローチを使用しようとしています。.NET コードに正しくマーシャリングされるように、アンマネージ構造体を宣言できることはわかっていますが、C++ コンパイラはそうしていないようです。
たとえば、私はこのコードを持っています(マネージド):
struct MyStruct
{
int some_int;
long some_long;
};
public ref class Class1
{
static MyStruct GetMyStruct()
{
MyStruct x = { 1, 1 };
return x;
}
};
コンパイルされますが、リフレクターを使用して見ると、コードは次のようになります。
public class Class1
{
// Methods
private static unsafe MyStruct GetMyStruct()
{
MyStruct x;
*((int*) &x) = 1;
*((int*) (&x + 4)) = 1;
return x;
}
}
[StructLayout(LayoutKind.Sequential, Size=8), NativeCppClass,
MiscellaneousBits(0x41), DebugInfoInPDB]
internal struct
{
}
基本的に、MyStruct のフィールドは .NET から見えません。C++ コンパイラに生成するように指示する方法はありますか?
答えるときは、これを考慮してください。私は、.NET フレームワークから見えるマネージ クラスを作成する方法を知っています。私はこれを行うことに興味がありません。私が望むのは、C++ コンパイラがアンマネージ構造体を .NET が理解できる方法で宣言することです。
[StructLayout(LayoutKind::Sequential, blablabla ... )]
struct MyStruct
{
[MarshalAs ....... ]
System::Int32 some_int;
[MarshalAs ....... ]
System::Int32 some_long;
};