2012-02-08 60 views
4

我有一个内置的.net文件,并在我的ASP.NET应用程序中将其引用为interop.mycomlib.dll。我在com对象中初始化一个类,然后调用一些函数,最后当用户注销或关闭浏览器时,我释放com对象。在ASP.net应用程序中处理Com对象

以下是我正在使用的代码。最初,对于第一个用户,InitInstance()被调用,但是当用户注销时,com的ExitInstance()未被调用。

如果有任何其他用户在InitInstance()上签名,则不会再次调用,因为所有用户都使用了com对象的相同实例。仅在执行iisreset或w3wp进程终止时调用ExitInstance()

这是com interop如何与asp.net协同工作的默认行为,还是我缺少一些东西来完全处理com对象?

public class ComFacade : IDisposable 
{ 
     public ComFacade() 
     { 
      myComObj_ = new MyCOMLib.MyClientClass(); 
     } 

     .............................. 

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

     protected virtual void Dispose(bool disposing) 
     { 
      if (!this.disposed) 
      { 
       if (disposing) 
       { 
        try 
        { 
         Marshal.ReleaseComObject(myComObj_); 
        } 
        catch (Exception ex) 
        { 
         throw; 
        } 
       } 
       this.disposed = true; 
      }    
     } 
} 

感谢

回答

2

你没有提到含有ComFacade实例变量的范围是什么。如果变量是静态的,那么这将是我期望的行为。

我建议你理解ASP.NET页面的生命周期及其与不同作用域的变量的影响。除非COM引用应该是单例,否则每次页面加载时都需要创建一个新实例,并根据需要进行处理(可能在页面呈现时)。

更新(基于评论)

:这个答案适用于.NET的任何对象,你尝试的时间更长保持一个单一的页面请求。最终所有对象都被丢弃/垃圾收集。

您提到该对象是在用户登录并注销时创建的。你可以做到这一点的唯一方法是将对象缓存在静态的东西中以保持对它的引用。请记住,每次用户在浏览器中执行某些操作时,都会从浏览器返回IIS/ASP.NET进行处理并调用页面生命周期(过度简化,但足够好)。用户每次执行此操作时,页面可能会每次都由应用程序池中的不同线程处理。如果多个用户正在与网站进行交互,那么在一段时间内,同一个线程可能(并且很可能会)被多个用户使用。简而言之,这就是为什么使用ASP.NET/IIS必须对使用单身/静态成员非常谨慎。

在附注上,我的问题是为什么您需要对多个单页请求的COM对象的引用?

+0

ComFacade实例不是静态的,它是在用户登录时创建的,同一实例用于用户所有对com的操作,直到用户签发为止,然后处理ComFacade语句。在这种情况下,我认为当用户签字时com也应该被处置,但是这不会发生。 – Arvind 2012-02-08 15:46:51

+0

@Arvind除非对象是静态的,否则它不会在请求之间持续存在,这意味着它必须在每次页面加载时重新实例化。而且,使用该对象调用.Dispose()的过程的责任是 - 它不会自动发生。 – 2012-02-08 16:57:12

+0

@Ken&David感谢您的解释,我们使用的com对象为每个客户端创建消息队列,并且这用于与主机服务进行交互,因为应用程序中的所有操作都使用此对象,直到签出为止对象才会保持活动状态。Comfacade在一个保持会话的对象中初始化,当用户签名或浏览器关闭时我处理com对象,然后ComFacade和对象从会话中移除,会话被清除并放弃以尝试完全处理com对象。这反正没有用。 – Arvind 2012-02-08 18:28:50

相关问题