2012-04-02 3 views
2

기본적으로, 내가하려고하는 것은 다른 클래스가 중복 프로세스를 만들 수 없도록 Word의 Singleton 인스턴스를 만드는 것입니다.VSTO/COM에 대한 싱글 톤 구현

public sealed class WordSingleton 
{ 
    private static Word.Application _App = null; 

    WordSingleton() { } 

    public static Word.Application App 
    { 
     get 
     { 
      if (_App == null) 
       _App = new Word.Application();     

      return _App; 
     } 
    } 

    // dispose the singleton from a single place 
    public static void Dispose() 
    { 
     if (_App != null) 
      _App.Quit(); 

     Marshal.ReleaseComObject(_App); 
    } 
} 

나는 이것으로 어려움을 겪고 마침내이 문제를 해결했습니다. 전문가가 내 사용법에 대해 조언 할 수 있는지 궁금해했다. 나는 다른 기술에서 왔기 때문에 이것은 나에게 아주 새로운 것이다.

+0

Word.Application을 사용하지 않고 Word 문서를 만들 수 있다는 것을 알고 계셨습니까? OpenXML이라고합니다 - http://www.microsoft.com/download/en/details.aspx?displaylang=ko&id=5124 –

+1

Word의 고유 한 인스턴스를 만들지 마십시오. VSTO에서는 Globals 클래스를 통해 호스팅 항목을 가져옵니다. [전역] [이 프로그램 신청] [1] [1] : http://msdn.microsoft.com/en-us/library/bhczd18c.aspx – Kiru

+0

크리스와 키루 감사합니다. 며칠 전 C#을 사용하기 시작했습니다. 나는 많은 자원을 사용하고 있지만 거기에는 많은 자료가 있으며 때로는 당신이하고 싶은 것을 알아 내기가 약간 혼란 스러울 수 있습니다 - 특히 다른 기술에서 왔습니다. 고맙습니다. –

답변

3

다음은이 작업을 수행하는 방법입니다. 대체 할 수 없도록 readonly 키워드를 사용하십시오. 이것은 threadsafe입니다.

public sealed class WordSingleton 
{  

    public static readonly Word.Application Instance = new Word.Application();  

    private WordSingleton() { } 

} 
+0

Chris : 저는 지금 위의 기술을 사용하고 있습니다. 간단하고 간단 :) –

1

왜 클래스 범위에서 초기화하지 않습니까?

private static Word.Application _App = new Word.Application(); 

이러한 단독 개체는 CLR로 제어됩니다. 일반적으로 폐기하십시오.

+0

+1 - 스레드 안전 우선 :) –

+0

Abatishchev, Chris : 위의 기법 스레드 안전합니까? 나는 그것을 정확히 이해하지 못했습니다. –

+0

예. 클래스 범위의 정적 변수 초기화는 스레드가 액세스하기 전에 초기화되므로 스레드 안전성으로 간주됩니다. 또한이 속성은 예제가 읽기 전용이므로 (getter 만) 인스턴스를 변경할 수 없습니다. –