我为本机C ++类编写了两个托管C ++包装器,我需要一个本机类B的非托管对象作为托管Wrapper A函数的返回参数,构造本机类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
答案 0 :(得分:1)
保护级别:我确定您已公开定义,但是包含该符号的dll怎么样?你确定你有最后一个版本吗?
不安全:为了使用/包装不安全/本机代码作为C ++,最好的选择是使用C ++ / CLI(ex Managed C ++),提供从Visual Studio 2005版本。只需定义一个包含您的本机/非托管类的 ref class ,就可以从托管代码直接访问该类,如C#。提示从Visual Studio开始:从Visual C ++部分打开一个新的dll CLR项目;
C ++ / CLI是最好的解决方案
答案 1 :(得分:0)
解决方案来自:Pass a C++/CLI wrapper of a native type to another C++/CLI assembly
// in WrapperB
property IntPtr _classB
{
IntPtr get() { return IntPtr(classB); }
}
// in WrapperA
ClassB *classB = static_cast<ClassB*>(wrapperB->_classB.ToPointer());
// ... do something ...