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



我已经为本机c++类编写了两个托管c++包装器,我需要一个本机类B的非托管对象作为构造本机类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

  1. 保护级别:我确定你有公共定义,但是包含符号的dll呢?你确定你有最新版本吗?

  2. Unsafe:为了使用/wrap不安全/本地代码作为c++,最好的选择是使用c++/CLI(不含Managed c++), 从Visual Studio 2005版本开始提供。只要定义一个ref类来包装你的本机/非托管类,这个类就可以直接从托管代码中访问,比如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 ...

相关内容

  • 没有找到相关文章

最新更新