我有其中有一个C ++项目和C#项目的解决方案。
在C ++项目定义一个类,我想在C#中实例化并调用它的成员函数。 到目前为止,我设法将类实例:
CFoo Bar = new CFoo();
但是,当我尝试调用它的函数,编译器说,这是不可用的。
此外,当我检查对象在调试器,没有成员被示出。
我缺少的是在这里吗?
我有其中有一个C ++项目和C#项目的解决方案。
在C ++项目定义一个类,我想在C#中实例化并调用它的成员函数。 到目前为止,我设法将类实例:
CFoo Bar = new CFoo();
但是,当我尝试调用它的函数,编译器说,这是不可用的。
此外,当我检查对象在调试器,没有成员被示出。
我缺少的是在这里吗?
需要声明的C ++ / CLI类的ref class
。
(请注意,我们谈论的是C ++ / CLI,不C ++,我认为你必须在你的C ++项目已经启用了CLR,或者您将无法获得新的CFoo
工作。)
编辑:
你并不需要所有的旧类转换到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)
}