呼叫C++;来自C#/.NET的函数 我有一个C++项目和C项目的解决方案。 C++项目定义类,我想在C语言中实例化并调用它的成员函数。到目前为止,我成功地实例化了该类: CFoo Bar = new CFoo();

呼叫C++;来自C#/.NET的函数 我有一个C++项目和C项目的解决方案。 C++项目定义类,我想在C语言中实例化并调用它的成员函数。到目前为止,我成功地实例化了该类: CFoo Bar = new CFoo();,c#,.net,c++-cli,unmanaged,C#,.net,C++ Cli,Unmanaged,但是当我试图调用它的函数时,编译器说,它不可用 此外,当我在调试器中检查对象时,不会显示任何成员 这里缺少什么?您需要在C++/CLI中将该类声明为ref类 (注意我们讨论的是C++ + CLI,不是C++。我假设你在C++项目中已经启用了CLR,或者你不能得到新的< < CFoo >代码>。 编辑: 您不需要将所有旧类转换为ref类 假设您有一些旧的C++: class FooUnmanaged { int x; FooUnmanaged() : x(5) {} }; 然后

但是当我试图调用它的函数时,编译器说,它不可用

此外,当我在调试器中检查对象时,不会显示任何成员


这里缺少什么?

您需要在C++/CLI中将该类声明为
ref类

(注意我们讨论的是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;
};
那很好。编译器不想在托管堆上的对象中分配嵌入的非托管对象的实例,但它很高兴有一个指针,它会在生成的IL中变成
System.IntPtr

这意味着您必须决定如何调用
delete
。最可能的解决方案是:

ref class FooManaged
{
    FooUnmanaged *u;

public:
    FooManaged(FooUnmanaged *u_)
        : u(u_) { }

    ~FooManaged() { delete u; }
};

就像其他C++类一样。在将来的某个版本中,C++/CLI可能会自动为我们执行此翻译

注意,生成的IL是
FooManaged
类现在实现了
IDisposable
,并且析构函数已经变成了
Dispose
方法。这允许.NET客户端正确地解除分配它,例如在C中#


C++项目是托管C++项目还是非托管项目?如果是这样的话,它是用/CLR(公共语言运行库支持)编译的。您有解决方案吗?请阅读我的帖子并在这方面帮助我。谢谢,如果我这样做,我会收到很多错误,例如:错误1错误C2814:本机类型不能嵌套在托管类型中。我想这意味着我需要将成员更改为托管类型。有没有办法避免这种情况?
using (var m = new FooManaged())
{

    // end of block: m will be disposed (and so FooUnmanaged will be deleted)
}