将包含struct的c++函数传递给c#,并使用Marshal.PtrToStructure将其转换为c#函数
本文关键字:函数 Marshal PtrToStructure 转换 struct c++ 包含 | 更新日期: 2023-09-27 18:29:19
我是c++的新手,所以我可能会在这方面犯一些错误。因此,我开始编写简单的C++函数,该函数将包含结构作为返回类型:
我的c++结构:
struct a {
int i;
};
我在库.h文件中的c++函数声明:
extern "C" __declspec(dllexport) struct a retNumber();
library.cpp文件中我的c++函数描述:
struct a retNumber()
{
struct a r = a();
r.i = 22;
return r;
}
所以我只想编译它,然后在c#代码中使用它,我得到了以下编译错误:
error C2371: 'retNumber' : redefinition; different basic types
error C2526: 'retNumber' : C linkage function cannot return C++ class
error C2556: 'a retNumber(void)' : overloaded function differs only by return type from 'void retNumber(void)'
这是我问题的第一部分,如果你们能帮助我解决它,我将非常感激,一旦它解决了,我将在我的c#代码中声明相同的结构:
struct a1
{
int i;
}
然后我要导入我的c++函数:
[DllImport("library.dll")]
public static extern a1 retNumber();
一旦完成,我将创建GCHandle:
a1 test = retNumber();
GCHandle handle = GCHandle.Alloc(test, GCHandleType.Pinned);
然后我会尝试转换我的实际结果并释放内存:
Object temp = Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(a1));
handle.Free();
所以到这个时候,我应该有一个类型为a1的对象,它包含值为22的变量I。
如果有人能延迟完成这个过程,我将不胜感激!提前非常感谢!!!
在C++方面,您需要将所有内容封装在extern "C"
中,包括结构:
extern "C" {
struct a {
int i;
};
};
在C#方面,您需要正确指定调用约定:
[DllImport("library.dll", CallingConvention=CallingConvention.Cdecl))]
public static extern a1 retNumber();
一旦您这样做,就不需要Marshal.PtrToStructure
调用了。只需:
a1 test = retNumber();
Console.WriteLine(a1.i); // Should print 22