Passage de la Structure à partir de C# C++

Je avoir la structure suivante en C++:

extern "C" __declspec(dllexport) struct SnapRoundingOption
{
    double PixelSize;
    bool IsISR;
    bool IsOutputInteger;
    int KdTrees;
};

Et c'est ma déclaration de fonction en C++:

extern "C" __declspec(dllexport) void FaceGenerationDummy(SnapRoundingOption snapOption);

C'est le code C# correspondant:

//I also tried not specifying Pack, but the same error occurred.
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SnapRoundingOption
{
    public  double PixelSize;
    public bool IsISR;
    public bool IsOutputInteger;
    public int KdTrees;

    public SnapRoundingOption(double pixelSize, bool isISR, bool isOutputInt, int kdTrees)
    {
        PixelSize = pixelSize;
        IsISR = isISR;
        IsOutputInteger = isOutputInt;
        KdTrees = kdTrees;
    }
}

[DllImport("Face.dll")]
public static extern void FaceGenerationDummy(SnapRoundingOption snapRoundingOption);

Cependant, lorsque j'appelle la FaceGenerationDummy avec ce test:

[Test]
public void DummyTest()
{
    SimpleInterop.FaceGenerationDummy(new SnapRoundingOption(10, true, false, 1));
}

J'ai trouvé que KdTrees est 0 en C++, au lieu de 1 comme passé.

Ce que je fais mal?

Edit 1: je suis à l'aide de Visual Studio 2008 sur Windows 7 32 bits.

Edit 2: les Deux sizeof(SnapRoundingOption) retour le même nombre – 16.

Êtes-vous sûr que l'alignement de livraison est également 1 en C++?
J'ai essayé les deux, préciser Pack et ne spécifiez pas Pack, aucun n'a fonctionné.
Aussi, est-ce que votre compilateur C++ envisager int à 32 bits de large?
Ooooh... où est le mot "struct" pour votre struct? C'est qu'une faute de frappe ou est-ce réellement ce que vous avez écrit?!
Découvrez la représentation de la mémoire de votre structure en C++ et utiliser le bon Pack et MarshalAs caractéristiques et les paramètres.

OriginalL'auteur Graviton | 2011-03-08