2011-07-06 2 views
3

VS2010이 있고 프로젝트에 COM 라이브러리에 대한 참조가 추가되었으며 VS는 프로젝트 내부에 기본 interop를 포함했습니다.COM을 수행 할 때 C# 4의 Marshal.ReleaseComObject를 호출해야합니까?

COM 라이브러리에서 객체를 참조하고 GC를 기다리지 않고 신속하게 객체를 처리하려면 ReleaseComObject를 호출해야합니까?

+0

null로 모든 COM 객체 참조를 설정하고 GC.Collect를()를 호출 훨씬 더 신뢰할 수있다. –

답변

3

Marshal.ReleaseComObject는 관리되는 코드에서 소비되는 모든 곳에서이 COM 개체에 대한 참조를 즉시 삭제할 수있는 방법을 제공합니다 (기본 IUnknown을 보유하고있는 RCW에서이를 해제하므로).

한스 (Hans)가 말한 것처럼 일반적으로 올바른 방법은 개체를 단순히 null로 두어 적절한 시점에 CLR 및 GC가 COM 개체를 삭제하도록 허용하는 것입니다.

그러나 즉각적인 조치가 필요한 상황 (COM 객체가 비싸고 부족한 자원을 보유하고 있거나 시퀀싱이 매우 복잡한 시스템 종료시)이 필요하면 ReleaseComObject를 호출하는 것이 옳은 일일 수 있습니다.

마틴

메모리를 청소의 측면에서 접근 방식의 두 가지 유형이 있습니다
+0

그래서, 값 비싼 리소스를 릴리스해야하므로 내 경우에는 ReleaseComObject를 호출하고 .net 변수를 null로 설정해야합니다. –

+0

예, 리소스를 즉시 공개해야하는 경우 이 문제가 perf issu로 표시되면 나는 그것을 할 것입니다. 또한 .net 변수를 먼저 null로 설정하십시오. –

+0

Hmmm ... 변수를 null로 설정하면 더 이상 ReleaseComObject에서 사용할 수 없습니다. –

0

.

  • 참조 카운팅 알고리즘
  • 쓰레기 수거는

COM 구성 요소는 메모리를 회수하기 위해 참조 카운팅 알고리즘을 사용합니다. com 구성 요소에 대한 참조가 필요하지 않을 때마다 호출 할 수 있습니다. 하지만 보통 내 접근 방식은 가상 스택을 만들고 C#의 소스 코드와 같은 참조를 삭제하는 것입니다. RCW가 살아있는 한 .NET은 COM 구성 요소가 살아 있음을 보장합니다. RCW 가비지 콜렉션 릴리스 메소드가 호출 될 때. 코드에서 release를 호출 할 필요는 없습니다. 그러나 gc주기에는 영향을 미치지 않습니다.

void DoSth 
{ 
     { 
      RunTimeCallableWrapper area for the code 
      ReleaseComObject 
     } 
} 
관련 문제