【发布时间】:2013-08-28 18:47:20
【问题描述】:
我对 c++ 很陌生,所以我可能在这方面有一些错误。 所以我开始编写简单的 C++ 函数,它将包含 struct 作为返回类型:
我的 c++ 结构:
struct a {
int i;
};
library.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 的对象。
如果任何人都可以通过这个过程进行延迟,我将不胜感激! 非常感谢您提前!!!
【问题讨论】:
-
我真的建议,如果您有 2 个问题,请分别提出。
-
它们相互依赖,c++ 的人将能够看到我在寻找什么
标签: c# c++ marshalling extern