我们正在将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必须,而且我不想复制。我只想包装这些类以便传递它们。
有一种干净简单的方法吗?
答案 0 :(得分:0)
似乎答案不是由语法或使用问题引起的。这两个托管对象位于不同的DLL中,无法通过.NET传递它们。一旦代码在同一个项目中编译,问题就解决了。
虽然错误消息表明问题是VS 2015中的可访问性问题,并且因为它在链接阶段报告了它,但我怀疑原因是因为链接器在没有声明的情况下不知道NativeB中NativeA的实现一个外在的。被包裹在CLR中,它表现为一个不同的问题。