您需要在 C++/CLI 中将该类声明为ref class
.
(请注意,我们谈论的是 C++/CLI,而不是 C++。我假设您必须在 C++ 项目中启用 CLR,否则您将无法获得新的CFoo
上班。)
Edit:
您不需要将所有旧课程转换为ref
类。
假设你有一些旧的 C++:
class FooUnmanaged
{
int x;
FooUnmanaged() : x(5) {}
};
然后尝试将其包装在 CLR 类中:
ref class FooManaged
{
FooUnmanaged m;
};
正如您所注意到的,您会收到一条错误消息,指出这是不允许的。但试试这个:
ref class FooManaged
{
FooUnmanaged *m;
};
那完全没问题。编译器不想分配嵌入在托管堆上的对象内的非托管对象的实例,但它很高兴有一个指针,它变成了System.IntPtr
在生成的 IL 中。
这意味着您必须决定如何致电delete
。最可能的解决方案是:
ref class FooManaged
{
FooUnmanaged *u;
public:
FooManaged(FooUnmanaged *u_)
: u(u_) { }
~FooManaged() { delete u; }
};
就像在任何其他 C++ 类中一样。 C++/CLI 可能会在未来的版本中自动为我们完成此转换。
请注意,得到的 IL 是FooManaged
类现在实现IDisposable
,并且析构函数已变成Dispose
方法。这允许 .NET 客户端正确地释放它,例如在 C# 中
using (var m = new FooManaged())
{
// end of block: m will be disposed (and so FooUnmanaged will be deleted)
}