首页 > 解决方案 > 在 c# 中编组组成 c/c++ 结构

问题描述

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

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

在 C# 代码中,我想从 C dll 调用 GetStructure()。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));

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

请问有什么机构可以帮助我吗?

标签: c#cmarshalling

解决方案


推荐阅读