2011-07-12 34 views
0

我已经为本地C++类编写了两个托管C++包装器,并且我需要本地类B的非托管对象作为构造本机类A的托管包装器A的函数中的返回参数!在C#中返回非托管对象指针

例子:

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

你确定这两个'WrapperB :: GetNativeClassB'和'WrapperA :: WrapperA'是上市? –

+0

包装A/B的构造是公开的,也GetNativeClassB设置为公开 – leon22

回答

1
  1. 防护等级:我敢肯定,你有公共定义,但对于包含符号的dll?你确定你有最新版本吗?

  2. 不安全:为了使用/包不安全/本地代码为C++,它是用C++/CLI是最好的选择(例如托管C++),只要从Visual Studio 2005的发布开始。只需定义一个ref class,它包装了您的本地/非托管类,该类将作为C#直接从托管代码访问。提示从Visual Studio开始:从Visual C++部分打开一个新的DLL CLR项目;

C++/CLI在我看来是最好的解决方案

+0

我使用WrapperB中的classB对象(从GetProcAddress从DLL加载),它工作正常,但返回对象到C#并绕过WrapperA (由于保护错误) – leon22

+0

确定包装是用C++/CLI编写 – leon22

+0

我认为你不能正确编写你的C++/CLI包装类,因为你在包装接口中使用了不安全的指针(WrapperA(ClassB * classB ) ),因此您需要使用不安全的块。例如wrapperA-> WrapperA :: WrapperA(WrapperB^classB)的构造函数。使用本机指针只在包装类 –