从 C# 到通过 PInvoke C++的简单结构中的垃圾数据
Garbage data in simple struct from C# to C++ via PInvoke
>我有一个简单的Size结构,定义为
#pragma pack(push, 8)
struct Size final
{
public:
std::int32_t Width = 0;
std::int32_t Height = 0;
};
#pragma pack(pop)
在C++和作为
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public class Size
{
public System.Int32 Width { get; set; }
public System.Int32 Height { get; set; }
}
在 C# 中。
现在,我正在尝试创建一个 C# Size 对象并将其发送到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# 中的public class Size
有关,它可能会为每个包含类型信息的对象引入一个"标头"(如果需要,可以称为"vtable 指针")。因此,c# 中对象的内存布局和 C++ 中结构的实例可能不匹配。
在 C# 中使用结构而不是类应该可以解决问题。
相关文章:
- 学习数据结构和算法的简单方法
- 简单的问题 - 如何从单独的"结构"内的'class'访问变量?
- 高效简单的结构比较运算符
- 非常简单的C 文本冒险的代码结构
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 是否有一种更简单的方法可以使用GDB将C捕获的C结构捕获
- 从 C# 到通过 PInvoke C++的简单结构中的垃圾数据
- 使用并集的简单结构中的成员变量别名
- 理解一个简单的C++类结构
- Spirit Qi用简单的C风格结构化输入解析问题
- 在OpenGL中移动一个简单的形状(形状在数据结构中)
- 使用 Qt 的简单线程 gui 应用程序的结构是什么?
- 使用结构体的简单"identifier 'xxx' is undefined"
- 有没有一个简单的移动结构的例子不会被忽略?
- (C++)关于结构和函数参数的简单问题
- -Weffc++ 关于具有shared_ptr的简单结构的警告
- 在没有序列化库的情况下,在 c++ 中从结构体读取和写入文件的最简单方法是什么?
- 运行这个简单的C ++程序(对结构数组进行排序)的更快方法
- 有关要从结构指针读取的代码的简单代码
- 为简单结构定义哪个复制/移动构造函数/运算符