呼叫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)
}