封送处理在C#中构成C / C ++结构

时间:2019-06-12 11:48:36

标签: c# c marshalling

我需要解决这个问题。我有结构(StructA),其中包含第二个结构的指针。第二种结构具有整数变量。

在下面的代码中,我有C过程(GetStrucure())。我想将整数值设置为StructB中的变量ValB。 StructA包含指向StructB的指针。 GetStrucure()返回StructA。这可以正常工作。

在C#代码中,我想从C dll调用GetStrucure()。 ValA返回正确,但ValB返回不正确的值3207020。为什么指针中的值不正确?

struct StructB
{
   int ValB;
};

struct StructA
{   
   StructB* S;
   int ValA;
};

和过程:

extern "C"
{
    __declspec(dllexport) StructA GetStrucure() 
    {   
        StructA sA;
        StructB sB;
        sB.ValB = 5;    

        sA.S = &sB;
        sA.ValA = 6;
        return sA;
    }
}    

和C#代码:

[StructLayout(LayoutKind.Sequential]   
public struct StructA
{        
    public StructB S;
    public int ValA;        
}

[StructLayout(LayoutKind.Sequential)]
public struct StructB
{
   [MarshalAs(UnmanagedType.I4)]
   public int ValB;
}

class Program
{
   [DllImport("TestLib.dll", CallingConvention = CallingConvention.Cdecl)]
   static extern StructA GetStrucure();        

   static void Main(string[] args)
   {
      StructA a = GetStrucure();            
   }
}

我也尝试过

[StructLayout(LayoutKind.Sequential]   
public struct StructA
{        
    public IntPtr S;
    public int ValA;        
}

StructB b = (StructB)Marshal.PtrToStructure(a.S, typeof(StructB));

但是我得到了不同的荒谬价值...

请有人能帮助我吗?

0 个答案:

没有答案