2012-09-18 2 views
7

내 클래스의 개인 필드로 dynamic COM 개체가 있습니다. 관리되는 리소스 (GC가이를 정리하는지)로 간주되는지 여부는 확실하지 않습니다.동적 COM 개체가 관리되는 리소스로 간주됩니까?

private dynamic _comConnector = null; 

...

_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId")); 

IDispose을 구현할 때, 나는 (폐기()가 명시 적으로 호출 한 경우에만) 관리 자원으로 그것을 청소, 또는해야 할 기본 자원으로 (시 폐기 (거짓)도 파이널 라이저에서 호출됩니까?

private void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     // Free managed resources // 

     // --> Should I call Marshal.FinalReleaseComObject(_comConnector) here? 
    } 

    // Free unmanaged resources // 

    // --> Or maybe here? 
} 
+0

예, GC가 정리합니다. IDisposable을 구현하지 않으므로 처분 할 것이 없습니다. –

+0

검색 후 'Activator.CreateInstance가 관리 또는 비 관리'이고 ... Dispose 때문에 찾고있었습니다. –

답변

6

이것은 관리 자원 (기본적으로 런타임 호출 가능 래퍼)이므로이를 정리해야합니다. MSDN states that : 각 RCW 그것이 랩과 RCW가 더 이상 필요하지 때 COM 객체에의 참조를 해제하지 않는 COM 개체에 인터페이스 포인터의 캐시를 유지 관리

. 런타임은 RCW에서 가비지 수집을 수행합니다.

.l.e. RCW는 관리되지 않는 COM 참조를 래핑하는 관리되는 리소스입니다.

COM 개체를 해제하는 경우 this blog post from Chris Brumme에서 설명한대로 응용 프로그램의 여러 위치에서 여러 스레드에서 사용하는 경우 위험 할 수 있습니다.

범위가 지정된 단일 스레드 방식으로 COM 개체를 사용하는 경우 작업을 완료하면 해당 개체에 대해 ReleaseComObject를 안전하게 호출 할 수 있습니다.

0

1 COM은 구성 요소이므로 모두 그가하는 일에 달려 있습니다. 정점 버퍼 인덱스 버퍼, 텍스처 등

에는 다음과 같은 기능을

  • 파일 열기

  • 네트워크 연결을 개방

  • 되지 않는 메모리

  • XNA하여 충족한다면

=> 그래서 네는 비 ressource

이 ressource에 대한 정보가없는

가비지 콜렉터 관리, 그래서 깨끗한 방금 Dispose 방법 (또는 블록을 사용하여 사용할 수 있습니다, 깨끗한 사용자

2입니다; 누가 처치를 끝내고 처분해야하는지).

관련 문제