在.net应用程序中使用Interop时获取COM异常

问题描述:

我有一个C#类,它使用一个使用interop的COM组件。 下面是示例代码:在.net应用程序中使用Interop时获取COM异常

public class MyClass 
{ 

MyCOMClass myObj=null; 
try 
{ 
myObj = new MyCOMClass(); 

for (int num = 0; num < myArr.Length; num++) 
{  
    //Call a method on myObj and do some processing 
} 
} 
catch(Exception ex) 
{ 
//log exception 
} 
finally 
{ 
if (myObj != null) 
      { 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(myObj); 
      } 

} 
} 

这里,for循环运行约150倍。

n在catch块中执行此代码时,出现异常: “已从其基础RCW中分离出的COM对象无法使用”。

我试图实现IDisposable接口和然后写Dispose方法:

public class MyClass: IDisposable 
{ 
public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(true); 
     } 


     protected virtual void Dispose(bool diposeMgdResources) 
     {    
      if (!this.disposed) 
      { 
       if (diposeMgdResources) 
       { 
        if (myObj != null) 
        { 
         System.Runtime.InteropServices.Marshal.ReleaseComObject(myObj); 
        } 
       } 
       this.disposed = true; 
      } 
     } 
} 

从客户端,我然后调用处理这个类,如: myClass.Dispose();

但是,这里仍然有相同的例外。我错过了什么?

感谢您的阅读。

+0

您可以粘贴'//在myObj上调用方法并执行一些处理代码?我的第一个猜测是对象在那里被清理。 – Grzenio 2010-09-14 13:36:37

看看这篇文章:

Marshal.ReleaseComObject considered dangerous

你可能不希望调用Marshal.ReleaseComObject()