从C#调用C ++函数/。NET(Call C++ functions from C#/.NET)

2019-07-30 16:34发布

我有其中有一个C ++项目和C#项目的解决方案。

在C ++项目定义一个类,我想在C#中实例化并调用它的成员函数。 到目前为止,我设法将类实例:

CFoo Bar = new CFoo();

但是,当我尝试调用它的函数,编译器说,这是不可用的。

此外,当我检查对象在调试器,没有成员被示出。

我缺少的是在这里吗?

Answer 1:

需要声明的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)
}


文章来源: Call C++ functions from C#/.NET