gpt4 book ai didi

c# - 将 C# 结构传递给 C++/CLI 以获得 C++ 包装器

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:37 26 4
gpt4 key购买 nike

昨天发布问题后,我以为我已经解决了这个问题,但我仍然有问题,我有一个 C++ 类的 C++/CLI 包装器,C++ 类的一些函数将 recv 的缓冲区作为参数,数据包结构被定义为 C++ 结构,这就是作为参数的内容。

在 C# 中,我使用 structlayout 复制了这些 C++ 结构,因此我在 C# 中拥有等效的结构,它们在内存中的布局与我的 C++ 结构相同。在我的 C++/CLI 代码中,我尝试了以下操作

UINT GetValues(value class^ JPVals) // value class, as C# structs are value types
{
IntPtr ptr;
Marshal::StructureToPtr(JPVals,ptr,false);
return m_pComms->GetValues(ptr,0); // m_pComms is a wrapped unmanaged class
//GetValues takes a pointer to a C++ struct
}

我得到的错误是无法将参数 1 从“System::IntPtr”转换为“SJPVal *”,为什么不能将值类编码为 C++ 结构指针?在这种情况下,我应该传递什么以及我应该如何编码它?

最佳答案

你没有得到序列化过程:

// !! Note the % !!
UINT GetValues(value class% JPVals) // value class, as C# structs are value types
{
// Allocate a buffer for serialization, pointer to NULL otherwise
IntPtr ptr = Marshal::AllocHGlobal(Marshal::SizeOf(JPVals));

try {
// Serialize the managed object to "static" memory (not managed by the GC)
Marshal::StructureToPtr(JPVals, ptr, false);

// Pass it to unmanaged code that will modify it.
auto ret = m_pComms->GetValues(reinterpret_cast<SJPVal*>(ptr.ToPointer()), 0);

// Copies the modifications back
Marshal::PtrToStructure(ptr, JPVals);

// Free resources
Marshal::FreeHGlobal(ptr);

return ret;
} catch (...) {
// Make sure we free the memory
Marshal.FreeHGlobal(ptr);
throw;
}
}

编辑:展示了如何复制回值。

当您使用 C# struct 时,您需要通过引用传递它以确保将更改复制回来。或者,代码将与 C# class 一起工作。现在,第一步 (StructureToPtr) 可能毫无用处,因为您可能不关心在调用 GetValues 之前那里有什么。

顺便说一下,您的命名约定有点糟糕。在 C++ 中,您应该以大写字母开头变量名。

关于c# - 将 C# 结构传递给 C++/CLI 以获得 C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9579783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com