简单结构中的垃圾数据,从C#到C++;平沃克大道

简单结构中的垃圾数据,从C#到C++;平沃克大道,c#,c++,pinvoke,C#,C++,Pinvoke,我有一个简单的大小结构,定义为 #pragma pack(push, 8) struct Size final { public: std::int32_t Width = 0; std::int32_t Height = 0; }; #pragma pack(pop) 在C++和AS [StructLayout(LayoutKind.Sequential, Pack = 8)] public class Size { public System.Int32 Width {

我有一个简单的大小结构,定义为

#pragma pack(push, 8)
struct Size final
{
public:
  std::int32_t Width = 0;
  std::int32_t Height = 0;
};
#pragma pack(pop)
在C++和AS

[StructLayout(LayoutKind.Sequential, Pack = 8)]
public class Size
{
    public System.Int32 Width { get; set; }
    public System.Int32 Height { get; set; }
}
在C#中

现在,我尝试创建一个C大小的对象并将其发送到C++代码,因为我在C++

中有这个函数
extern "C" {
__declspec(dllexport) auto Test(Common::Size size) -> void;
}

auto Test(const Common::Size size) -> void
{
    // Do something
}
以及一个PInvoke C#函数,将其称为:

[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Test")]
public static extern void Test(Common.Size size);
总而言之,我确实使用以下代码调用了Test函数:

var outputSize = new Common.Size() { Width = 100, Height = 200 };
PluginApi.Test(outputSize);

现在,我希望C++函数中的参数大小分别具有100和200的宽度和高度,但我得到的是垃圾号,更确切地说,宽度为132313736,高度为0。


在这种情况下我做错了什么?

它与C#中的
公共类大小有关,这可能会为每个对象引入一个“头”,例如,保存类型信息(如果需要,可以使用“vtable指针”)。因此,C++中对象的内存布局和C++中的结构实例可能不匹配。

在C#中使用结构而不是类应该可以解决这个问题。

我认为这与
公共类大小有关,它可能会为每个对象引入一个“头”,例如,包含类型信息(如果需要,可以使用“vtable指针”)。因此,c#中对象的内存布局和c中结构的实例可能不匹配。你试过在C#中使用struct吗?你完全正确!那是我的一大疏忽。。将其更改为struct可以解决此问题!你能添加你的评论作为答案吗?这样我就可以将其标记为已解决?谢谢,洗剂可以解决问题,但原因完全不同。不正确。真正的区别在于,c#class被封送为引用,即指针,而c#struct被封送为值。