在托管程序集中传递本机shared_ptr

时间:2016-12-07 18:27:12

标签: pointers c++-cli shared-ptr

我们正在将C#代码转换为C ++,但我们需要分阶段完成。我现在需要从托管代码中实例化几个本机对象。我无法更改这些本机对象,它们的声明如下所示:

public class NativeA();
public class NativeB(std::shared_ptr<NativeA> obj);

NativeA和NativeB都需要从托管代码实例化为:

void main() {

    ManagedA ObjectA = gcnew ManagedA();
    ManagedB ObjectB = gcnew ManagedB(ObjectA);

}

问题在于在NativeB的构造函数中获取NativeA的shared_ptr。 Niether NativeA和NativeB将在托管代码中进行操作,它们只需要实例化。理想情况下,这样的事情:

public ref class ManagedA {
public:
    ManagedA() { _object = new NativeA(); }
    ~ManagedA() { delete _object; }

    NativeA * Get() { return _object; }

private:
    NativeA *_object;
};

public ref class ManagedB {
public:
    ManagedB(ManagedA^ objectA ) { 
        _object = new NativeB(std::make_shared<NativeA>(*objectA->Get()); 
    }
    ~ManagedB() { delete _object; }

private:
    NativeB *_object;
};

但是,c ++ / cli中不允许这样做,因为本机类型被声明为私有。定义#pragma make_public(NativeA)也无法解决此问题。

我的意图是不使用托管代码中的本机对象,它们只需要实例化,所以我真的不在乎尝试编组本机指针并处理.NET GC如果我不这样做&# 39; t必须,而且我不想复制。我只想包装这些类以便传递它们。

有一种干净简单的方法吗?

1 个答案:

答案 0 :(得分:0)

似乎答案不是由语法或使用问题引起的。这两个托管对象位于不同的DLL中,无法通过.NET传递它们。一旦代码在同一个项目中编译,问题就解决了。

虽然错误消息表明问题是VS 2015中的可访问性问题,并且因为它在链接阶段报告了它,但我怀疑原因是因为链接器在没有声明的情况下不知道NativeB中NativeA的实现一个外在的。被包裹在CLR中,它表现为一个不同的问题。