我需要解决这个问题。我有结构(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));
但是我得到了不同的荒谬价值...
请有人能帮助我吗?