我有一个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++里面会调不到?

解决方案 »

  1.   

    没用过C++/CLT,不太懂,按理是可以调用的啊
      

  2.   

    你按它的提示,在Matrix类里定义一个析构函数吧,在析构函数里释放
    public ~Matrix()
    {
       Dispose(true);
       GC.SuppressFinalize(this);}
      

  3.   

    问题出在IDispose接口上。
    其实Intellisence可以看到Dipose方法,但是该方法成了protected的,而不是public.
    你可以像2楼说的那样,定义析构函数,然后再用delete matrix.这样就行了。
      

  4.   


    析构函数是可以解决这个问题, 只是觉得比较奇怪,明明一个public方法到了C++就变了
    即使不继承IDisopsable, 只定义Dispose()方法, 还是只能看不能用。
      

  5.   

    即使不继承IDisopsable, 只定义Dispose()方法, 还是只能看不能用。
    ===================
    你把Dispose名字改成Dispose1()看看行不行?
    是不是C++对Dispose敏感?
      

  6.   

    delete matrix; 等同于 C#的matrix.Dispose();
      

  7.   


    好像有点这个意思。
     // 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(); }
         }
     }