【发布时间】:2014-11-10 12:28:29
【问题描述】:
我正在用 Mono(所以 COM、CLI 不是选项)和一堆 extern 封装 FBX SDK(已关闭,带有公共 API)的一部分,一切进展顺利,直到我不得不返回一个非指针实例。 See here
关键是我必须将它返回给 C++ 以进行另一个调用。因为我不知道如果没有指针你会怎么做,我就这样返回了它:
FBXAPI FbxProperty* Object_GetFirstProperty(FbxObject* obj)
{
return &obj->GetFirstProperty();
}
..直到我尝试类似下一个 sn-p 的操作,我才得到 “System.AccessViolationException : Attempted to read or write protected memory。这通常表明其他内存已损坏。” 消息。
FBXAPI const wchar_t* Property_GetName(FbxProperty* prop)
{
int c = prop->GetSrcPropertyCount();
return L"Test";
}
如果我在 C++ 中使用相同的调用使用几乎相同的代码,那很好。我以同样的方式又做了大约 20 个函数调用,但不必“指针”它,它们也都很好,所以我不认为我的 DllImport 应该受到责备。因此,如果应归咎于参考,我该怎么做呢?我肯定不会因为有人从 API 调用它而在某处存储全局静态引用吗?
感谢任何帮助,C/C++ 和它处理内存的显式方式对我来说是新的。
【问题讨论】:
-
我发现您的问题令人困惑:标题表明问题是关于非指针返回值,然后您继续解释您需要如何返回指针。此外,问题是关于 P/Invoke 但您只提供 C++ 签名,而不是相应的 C# P/Invoke 签名。
-
我们不知道 FbxProperty 是什么。而且我们无法判断您返回的地址是否仍然有效。而且你没有显示任何 c#。
-
C++/CLI 是否适合您?如果是这样,这注定要在 Windows 上编写一个 C# 包装器;通过正确的 P/Invoke 为您省去所有麻烦。
-
感谢 cmets,我已经澄清了新的问题标题,并澄清这是为了跨平台(单声道)分发,所以 CLI 不是一个选项 - 我希望是这样!跨度>