我有一个内置的.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;
}
}
}
感谢
ComFacade实例不是静态的,它是在用户登录时创建的,同一实例用于用户所有对com的操作,直到用户签发为止,然后处理ComFacade语句。在这种情况下,我认为当用户签字时com也应该被处置,但是这不会发生。 – Arvind 2012-02-08 15:46:51
@Arvind除非对象是静态的,否则它不会在请求之间持续存在,这意味着它必须在每次页面加载时重新实例化。而且,使用该对象调用.Dispose()的过程的责任是 - 它不会自动发生。 – 2012-02-08 16:57:12
@Ken&David感谢您的解释,我们使用的com对象为每个客户端创建消息队列,并且这用于与主机服务进行交互,因为应用程序中的所有操作都使用此对象,直到签出为止对象才会保持活动状态。Comfacade在一个保持会话的对象中初始化,当用户签名或浏览器关闭时我处理com对象,然后ComFacade和对象从会话中移除,会话被清除并放弃以尝试完全处理com对象。这反正没有用。 – Arvind 2012-02-08 18:28:50