2012-02-08 3 views
4

com에 dll을 내장하고 ASP.NET 응용 프로그램에서 interop.mycomlib.dll이라고합니다. com 객체의 클래스를 초기화 한 다음 일부 함수를 호출하고 마지막으로 사용자가 로그 오프하거나 브라우저를 닫으면 com 객체가 해제됩니다.com.net 개체를 ASP.net 응용 프로그램에 배포

아래 코드는 제가 사용하고있는 코드입니다. 처음에는 첫 번째 사용자의 경우 InitInstance()이 호출되었지만 사용자가 com의 ExitInstance()을 로그 오프 할 때 호출되지 않습니다.

com 개체의 동일한 인스턴스가 모든 사용자에게 사용되므로 InitInstance()에 서명 한 다른 사용자는 다시 호출되지 않습니다. ExitInstance()은 iisreset이 수행되거나 w3wp 프로세스가 종료 될 때만 호출됩니다.

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 참조가 싱글 톤 (singleton)으로되어 있지 않다면, 페이지가로드 될 때마다 새로운 인스턴스를 생성하여 적절하게 처리해야합니다 (아마 페이지가 렌더링 될 때). (주석 기준)

업데이트

:이 답변은 단일 페이지 요청하는 것이 더 오래 유지하려고 .NET에서 모든 개체에 적용됩니다. 결국 모든 객체는 폐기/가비지 수집됩니다.

사용자가 로그 오프 할 때 개체가 만들어지고 로그 오프 할 때 삭제됩니다. 이 작업을 수행 할 수있는 유일한 방법은 오브젝트를 정적 인 것으로 캐시하여 참조를 유지하는 것입니다. 사용자가 브라우저에서 작업 할 때마다 브라우저에서 IIS/ASP.NET으로 다시 이동하여 페이지 라이프 사이클 (지나치게 단순화되었지만 충분 함)을 호출합니다. 사용자가이 작업을 수행 할 때마다 페이지가 매번 응용 프로그램 풀의 다른 스레드에 의해 처리 될 수 있습니다. 둘 이상의 사용자가 사이트와 상호 작용하는 경우 일정 기간 동안 동일한 스레드가 둘 이상의 사용자에 의해 사용 될 수 있습니다. 간단히 말해서 ASP.NET/IIS에서는 싱글 톤/스태틱 멤버를 사용할 때 매우 신중해야합니다.

내 질문에 하나 이상의 페이지 요청에 대한 COM 개체에 대한 참조가 필요한 이유는 무엇입니까?

+0

ComFacade 인스턴스는 정적이 아니며 사용자 signsoff가 생길 때까지 com과의 모든 작업에 대해 사용자 signson 및 동일한 인스턴스가 사용자에게 사용될 때 만들어지며 ComFacade 인스턴스가 삭제됩니다. 이 경우에는 사용자가 signsoff하지만 com이 처리되지 않아야한다고 생각합니다. – Arvind

+0

@Arvind 객체가 정적이지 않으면 요청간에 지속되지 않으므로 모든 페이지로드시 다시 인스턴스화해야합니다. 또한, 객체를 사용하여 .Dispose()를 호출하는 것은 프로세스의 책임입니다. 자동으로 발생하지는 않습니다. –

+0

@Ken & David 설명 주셔서 감사합니다. 우리가 사용하는 com 객체는 각 클라이언트에 대한 메시지 대기열을 만들고 응용 프로그램의 모든 작업이 이것을 사용하기 때문에 호스트 서비스와 상호 작용하는 데 사용됩니다.Comfacade는 세션에 보관 된 객체에서 초기화됩니다. 사용자 signsoff 또는 브라우저가 닫히면 com 객체와 ComFacade가 삭제되고 객체는 세션에서 제거되고 세션은 삭제되고 완전히 폐기됩니다. com 객체. 어쨌든 이것은 효과가 없었습니다. – Arvind

관련 문제