C++/CLI 不能调C# class 的 Dispose()方法

xiehuanxie 2010-05-26 11:00:34
我有一个C# class 实现了IDisposable接口


public class Matrix<T> : IDisposable, ICloneable, IEnumerable<T>


...

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}



在C#里面调用都是没问题的, 但是在c++里调用里出现编译错误:
Error 1 error C2039: 'Dispose' : is not a member of ‘Mathematics::Matrix<T>'

output:
error C2039: 'Dispose' : is not a member of 'InScan::Infrastructure::Common::Mathematics::Matrix<T>'
1> with
1> [
1> T=byte
1> ]
1> You should invoke the destructor, '~Matrix<unsigned char>' instead

所以我现在只能这样:

delete matrix;
GC::Collect();


为什么Dispose()方法在C++里面会调不到?
...全文
174 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiehuanxie 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gxingmin 的回复:]
即使不继承IDisopsable, 只定义Dispose()方法, 还是只能看不能用。
===================
你把Dispose名字改成Dispose1()看看行不行?
是不是C++对Dispose敏感?
[/Quote]

好像有点这个意思。


// C++/CLI
ref class MyClass // :IDisposable (编译器自动实现IDisposable接口)
{
public:
MyClass(); // 构造函数
~MyClass(); // (确定的) 析构函数 (编译器使用IDisposable.Dispose来实现)
protected:
!MyClass(); // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现)
public:
static void Test()
{
MyClass auto; // 这不是个句柄,它将调用MyClass的默认构造函数
// 使用auto对象
// 函数返回前自动调用auto的析构函数(IDisposable.Dispose,由~MyClass()定义)来释放资源
// 以上代码等效于:
MyClass^ user = gcnew MyClass();
try { /* 使用auto对象 */ }
finally { delete user; /* 由编译器调用auto.Dispose() */ }
}
};
// C#
class MyClass : IDisposable
{
public MyClass() {} // 构造函数
~MyClass() {} // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现),与C++/CLI的!MyClass()等效
public void Dispose() {} // Dispose方法
public static void Test()
{
using(MyClass auto = new MyClass())
{ /* 使用auto对象 */ }
// 因为使用了using句法,编译器自动调用auto.Dispose()
// 以上代码等效于:
MyClass user = new MyClass();
try { /* 使用user对象 */ }
finally { user.Dispose(); }
}
}

gomoku 2010-05-26
  • 打赏
  • 举报
回复
delete matrix; 等同于 C#的matrix.Dispose();
gxingmin 2010-05-26
  • 打赏
  • 举报
回复
即使不继承IDisopsable, 只定义Dispose()方法, 还是只能看不能用。
===================
你把Dispose名字改成Dispose1()看看行不行?
是不是C++对Dispose敏感?
xiehuanxie 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 stonepicker 的回复:]
问题出在IDispose接口上。
其实Intellisence可以看到Dipose方法,但是该方法成了protected的,而不是public.
你可以像2楼说的那样,定义析构函数,然后再用delete matrix.这样就行了。
[/Quote]

析构函数是可以解决这个问题, 只是觉得比较奇怪,明明一个public方法到了C++就变了。。。
即使不继承IDisopsable, 只定义Dispose()方法, 还是只能看不能用。
StonePicker 2010-05-26
  • 打赏
  • 举报
回复
问题出在IDispose接口上。
其实Intellisence可以看到Dipose方法,但是该方法成了protected的,而不是public.
你可以像2楼说的那样,定义析构函数,然后再用delete matrix.这样就行了。
gxingmin 2010-05-26
  • 打赏
  • 举报
回复
你按它的提示,在Matrix类里定义一个析构函数吧,在析构函数里释放
public ~Matrix()
{
Dispose(true);
GC.SuppressFinalize(this);

}
gxingmin 2010-05-26
  • 打赏
  • 举报
回复
没用过C++/CLT,不太懂,按理是可以调用的啊

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧