繁体   English   中英

在 C# 中返回非托管 object 指针

[英]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

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

  2. 不安全:为了使用/包装不安全/本机代码作为 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM