我在.net中内置了一个com dll,并在我的ASP.NET应用程序中将其称为interop.mycomlib.dll。我在com对象中初始化一个类然后调用一些函数,最后当用户注销或关闭浏览器时,我释放了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;
}
}
}
由于
答案 0 :(得分:2)
您没有提到包含ComFacade实例的变量的范围。如果变量是静态的,那么这就是我期望的行为。
我建议你理解ASP.NET页面生命周期及其对不同范围变量的影响。除非COM引用应该是单例,否则每次页面加载时都需要创建一个新实例并在适当时处理它(可能在页面呈现时)。
更新(根据评论)
注意:此答案适用于您尝试在单个页面请求中保留更长时间的.NET中的任何对象。最终所有对象都被处理/垃圾收集。
您提到该对象是在用户登录时创建的,并在用户注销时处理。你可以做到这一点的唯一方法是将对象缓存在静态的东西中以保持对它的引用。请记住,每次用户在浏览器中执行某些操作时,请求都会从浏览器返回到IIS / ASP.NET进行处理并调用页面生命周期(过度简化,但足够好)。每次用户执行此操作时,每次都可以由应用程序池中的不同线程处理该页面。如果多个用户正在与该站点进行交互,则在一段时间内,同一个线程可能(并且很可能将)被多个用户使用。简而言之,这就是为什么使用ASP.NET / IIS时你必须非常谨慎地使用单例/静态成员。
在旁注中,我的问题是为什么您需要对COM对象的引用才能获得多个页面请求?