在C#中返回非托管对象指针

时间:2011-07-12 11:28:19

标签: c# pointers object unmanaged managed

我为本机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

2 个答案:

答案 0 :(得分:1)

  1. 保护级别:我确定您已公开定义,但是包含该符号的dll怎么样?你确定你有最后一个版本吗?

  2. 不安全:为了使用/包装不安全/本机代码作为C ++,最好的选择是使用C ++ / CLI(ex Managed C ++),提供从Visual Studio 2005版本。只需定义一个包含您的本机/非托管类的 ref class ,就可以从托管代码直接访问该类,如C#。提示从Visual Studio开始:从Visual C ++部分打开一个新的dll CLR项目;

  3. 在我看来,

    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 ...