2011-11-08 5 views
4

COM 형식 (tlbimp.exe을 사용하여 생성)과이 개체를 래핑하는 C# 클래스가 있습니다. C# 래퍼의 마무리 도구에서 정리를 수행하려고합니다.finalizer에서 COM 객체를 참조하거나 사용할 수 있습니까?

public class MyClass : IDisposable 
{ 
    private IMyComObject comObject; 

    public MyClass() 
    { 
     comObject = new MyComObject(); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    ~MyClass() 
    { 
     Dispose(false); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     // Be tollerant of partially constructed instances 
     if (comObject != null) 
     { 
      comObject.Cleanup(); 
      // Account for object being disposed twice 
      comObject = null; 
     } 
    } 

    // Other bits go here... 
} 

나는 파이 나라가 어떤 순서로 실행 수 있다는 것을 알고 내가 tlbimp 말할 수있는 내가 그러나 지금까지, 파이널 라이저를 구현하는 객체를 사용하려고 시도해서는 안 : 나는 다음처럼 작성할 수있는 가이드 라인 here에 따라 생성 된 COM 유형은 finalizer를 구현하지 않으므로 위의 내용은 정상입니다.

그러나이 질문에 은 최종 사용자의 COM 개체를 참조하고 사용하는 것이 안전합니까? 그렇다면 공식 문서를 찾을 수 없었습니다.

+0

당신이 당신의 폐기 방법의 시작 부분에 GC를 호출하려고 했습니까? – Bond

+0

그들은 finalizer를 구현합니다. COM 개체가 해제되는 방법입니다. 따라서 안전하지 않습니다. –

+0

@HansPassant 나는 이것을 생각했지만 이것을 설명하는 문서를 찾을 수 없으며 해체에서 최종자를 볼 수 없다. – Justin

답변

-1

필자는 모든 com 래퍼 클래스를 파생시킨 추상 com 래퍼 클래스를 만들었습니다. 나는 아주 잘 작동한다. 늦은 바인딩이 필요하기 때문에 원래 코드는 VB입니다. 나머지 애플 리케이션은 C#으로 작성되었습니다.

public abstract class ComWrapper : IDisposable 
{ 
    protected internal object _comObject; 
    protected ComWrapper(object comObject) 
    { 
     _comObject = comObject; 
    } 

    #region " IDisposable Support " 

    private bool _disposed = false; 

    protected virtual void FreeManagedObjects() 
    { 
    } 

    protected virtual void FreeUnmanagedObjects() 
    { 
     ReleaseComObject(_comObject); 
    } 

    private void Dispose(bool disposing) 
    { 
     if (!_disposed) { 
      if (disposing) { 
       FreeManagedObjects(); 
      } 
      FreeUnmanagedObjects(); 
      _disposed = true; 
     } 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    protected override void Finalize() 
    { 
     Dispose(false); 
     base.Finalize(); 
    } 

    #endregion 
} 

public static class Helpers 
{ 
    public static void ReleaseComObject(ref object o) 
    { 
     if ((o != null)) { 
      try { 
       Marshal.ReleaseComObject(o); 
      } catch { 
      } finally { 
       o = null; 
      } 
     } 
    } 

    public static string ToDotNetString(object comString) 
    { 
     if (comString == null) { 
      return string.Empty; 
     } 
     string s = comString.ToString(); 
     ReleaseComObject(ref comString); 
     return s; 
    } 
} 
+0

이것은 실제로 내 질문에 답하지 않습니다 (또는 컴파일) – Justin

관련 문제