[英]Return unmanaged object pointer in C#
I have written two managed C++ wrappers for native C++ classes and I need a unmanaged object of native Class B as a return param in function of managed Wrapper A that construct native Class A!
例子:
// Wrapper A
WrapperA::WrapperA(ClassB *classB)
{
ClassA *classA = new ClassA(classB);
...
}
// native c++
ClassA::ClassA(ClassB *classB)
{
m_classB = classB; // ClassB *m_classB; in .h
...
}
// Wrapper B
ClassB* WrapperB::GetNativeClassB()
{
return m_classB; // ClassB *m_classB; in .h
}
// in C#
...
WrapperB wrapperB = new WrapperB();
unsafe // need for C++ pointer
{
WrapperA wrapperA = new WrapperA(wrapperB.GetNativeClassB() );
// Error: is inaccessible due to its protection level
// -> is set to public
}
...
有没有更好的方法没有不安全以及为什么我得到一个访问错误???
先感谢您!
迎接 leon22
保护级别:我确定您已公开定义,但是包含该符号的 dll 呢? 你确定你有最后一个版本?
不安全:为了使用/包装不安全/本机代码作为 C++,最好的选择是使用 C++/CLI(前托管 C++),从 Visual Studio 2005 版本开始提供。 只需定义一个ref class包装您的本机/非托管 class,即可从托管代码直接访问,如 C#。 从 Visual Studio 开始的提示:从 Visual C++ 部分打开一个新的 dll CLR 项目;
我认为 C++/CLI 是最好的解决方案
解决方案: 将本机类型的 C++/CLI 包装器传递给另一个 C++/CLI 程序集
// in WrapperB
property IntPtr _classB
{
IntPtr get() { return IntPtr(classB); }
}
// in WrapperA
ClassB *classB = static_cast<ClassB*>(wrapperB->_classB.ToPointer());
// ... do something ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.