3

一部の 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;
};
4

2 に答える 2

1

C++ マネージ コードから、.NET アプリに表示される public 構造体を定義する場合は、次の方法があります ('public' および 'value' キーワードに注意してください)。

[StructLayout(LayoutKind::Sequential)]
public value struct MyStruct
{
    int some_int;
    long some_long;
};

アンマネージ構造体を C# と C/C++ の間で移動する場合は、両方で宣言する必要があります。Cで次のように:

struct MyUnmanagedStruct
{
         int some_int;
         long some_long;
};

たとえば、C# では次のようになります。

[StructLayout(LayoutKind.Sequential)]
struct MyUnmanagedStruct
{
    public int some_int;
    public long some_long; // or as int (depends on 32/64 bitness)
};

.NET のフィールドが C のフィールドと一致することを確認する必要があります。StructLayout属性 (特に Pack) を使用することをお勧めします。こちらの 2 つのチュートリアルを参照してください: Structs チュートリアルとこちら: How to: Marshal Structures Using PInvoke

于 2012-01-09T12:49:52.080 に答える
1

この質問は、過去 2 年間で 194 回表示されました。これが不可能であることの十分な証拠として、答えの欠如を考えてください。アンマネージ構造体マーシャリングする必要があります。構造体の .NET レイアウト規則は、C または C++ コンパイラのレイアウト規則と基本的に互換性がありません。 この回答は、.NET がこのように動作する理由に関する背景情報を提供します。

于 2012-01-09T13:43:28.540 に答える