본문 바로가기
프로그래밍/c#

[c#] STAThread/COM(Component Object Model)

by 그래도동 2021. 1. 12.
728x90
반응형

1. STAThread란?

Indicates that the COM threading model for an application is single-threaded apartment (STA).

- MSDN -

응용 프로그램의 COM 스레딩 모델이 STA (단일 스레드 아파트) 임을 나타냅니다.

 

무슨 말인지 잘 모르겠어서 구글링을 해보았다.

 

STAThreadAttribute는 기본적으로 Windows 메시지 펌프가 COM 구성 요소와 통신하기위한 요구 사항입니다. 핵심 Windows Forms는 COM을 사용하지 않지만 시스템 대화 상자와 같은 OS의 많은 구성 요소가이 기술을 사용합니다.

 

COM 스레딩 모델은 COM interop을 사용하는 응용 프로그램에만 적용됩니다. COM 스레딩 모델을 단일 스레드 아파트 또는 다중 스레드 아파트로 설정할 수 있습니다. 응용 프로그램 스레드는 스레드가 실제로 COM 구성 요소를 호출하는 경우에만 COM 인터op용으로 초기화됩니다. COM interop을 사용하지 않으면 스레드가 초기화되지 않고 STAThreadAttribute 특성이 있으면 아무런 영향도 미치지 않습니다.

로 시작합니다.다음 표에서 볼 수 있듯이, COM interop의 기본 스레딩 모델인 NET Framework 버전 2.0은 응용 프로그램을 개발하는 언어에 따라 달라집니다.

 

LanguageCOM apartment model

C# Multithreaded apartment
C++ Multithreaded apartment
Visual Basic Single-threaded apartment

STAThreadAttribute는 응용 프로그램의 COM 스레딩 모델이 단일 스레드 아파트임을 나타냅니다. 이 특성은 Windows Forms를 사용하는 모든 응용 프로그램의 진입 점에 있어야합니다. 생략하면 Windows 구성 요소가 제대로 작동하지 않을 수 있습니다. 특성이없는 경우 응용 프로그램은 Windows Forms에서 지원되지 않는 다중 스레드 아파트 모델을 사용합니다.

 

결국 COM <- 이라는 객체를 사용하기 위함이다.

 

그러면

 

2. COM 이란?

 COM은 부품 역할을 하는 소프트웨어이다. COM 컴포넌트는 그래픽 프로그래밍에 서툰 프로그래머가 화려한 차트 기능을 어플리케이션에 넣을 수 있도록 해주고, 엑셀 문서의 파일 구조를 몰라도 엑셀 문서를 읽거나 쓸 수 있도록 해준다.

 C#을 비롯한 .NET 언어들은 RCW(Runtime Callable Wrapper)를 통해 COM 컴포넌트를 사용할 수 있다.
RCW는 .NET 프로엠워크가 제공하는 Type Library Importer(tlbimp.exe)를 이용해서 만들 수 있는데, 비주얼 스튜디오를 이용해서 COM 객체를 프로젝트 참조에 추가하면 IDE가 자동으로 tlbimp.exe를 호출하여 RCW를 만들어준다. 

 

이 개념에 익숙하지 않은 경우 자주 사용되는 아파트 건물의 비유가 이를 명확히하는 데 도움이 될 수 있습니다.

  • 건건물을 응용 프로그램의 프로세스로 생각하면 각 아파트는 COM 개체를 만들 수있는 별개의 영역입니다.
  • 하나의 COM 아파트는 동일한 건물/프로세스의 다른 아파트와 일부 유사점을 공유하는 독립적인 단위입니다.
  • 그러나 같은 건물에 로프트, 스튜디오, 침실 2 개 또는 3 개 아파트가있을 수있는 것처럼 프로세스 내에 다른 유형의 COM 아파트가있을 수도 있습니다. 
  • 아파트는 비어 있거나 여러 사람 / 물건이 거주 할 수도 있습니다.

COM 아파트에 대한 몇 가지 핵심 사항을 기억하는 것이 도움이 될 수 있습니다.

  • 아파트는 스레드가 아닙니다. 스레드(threads)와 단일 스레드 아파트 사이의 일대일 관계는 두 용어가 서로 바꿔서 사용할 수 있다고 믿어야합니다.
  • 개체(object)는 아파트가 아닙니다. 개체는 아파트에서 생성됩니다.
  • 개체의 특정 인스턴스는 하나의 아파트에만 속할 수 있습니다.
  • 아파트의 동시성 모델은 단일 스레드이든 다중 스레드이든 관계없이 생성 된 후에는 변경할 수 없습니다.
  • 프로세스에는 CoInitialize를 호출하는 각 스레드에 대해 하나씩 0 개 이상의 단일 스레드 아파트가있을 수 있습니다.
  • 프로세스에는 하나의 다중 스레드 아파트가 있거나 전혀 없습니다. 
  • COINIT_MULTITHREADED를 사용하여 CoInitializeEx를 호출하는 모든 스레드는 동일한 아파트를 공유합니다.

COM의 장점

1. 이식성: 새로운 프로그램에 대한 강력한 이식성은 개발기간을 단축시킨다.
2. 유연성: 컴으로 작업한 소프트웨어를 업그레이드 하고자 할 경우 단순히 업그레이드된 컴포턴트만 복사하면 되고 업그레이드 되지 않은 컴포넌트를 사용하지 않은 경우에도 잘 수행된다.
3. 재 컴파일할 필요가 없다.
4. 객체지향 개발 방법론(com) 은 프로그램의 구현방법을 획기적으로 바꾸었다.
5. com 의 경우 플랫폼에 독립적이다.


STAThreadAttribute 특성을 사용하여 스레딩 모델을 단일 스레드 아파트로 명시 적으로 설정하려는 몇 가지 경우

  • Windows Forms 앱을 개발 중 Windows Forms 앱은 클립 보드 또는 Windows 일반 대화 상자와 같은 Windows 시스템 구성 요소와 통신하거나 끌어서 놓기 기능과 같은 시스템 기능을 사용하는 경우 단일 스레드 여야합니다. C # 용 Windows Forms 애플리케이션 템플릿은 C # 프로젝트에 STAThreadAttribute 특성을 자동으로 추가합니다. 단일 스레드 아파트 모델이 Visual Basic의 기본값이므로 특성이 필요하지 않습니다.
  • COM interop에 의존하는 Visual Basic 라이브러리를 호출하는 C# 앱을 개발할경우 단일 스레드 아파트 모델은 Visual Basic의 기본값이므로 STAThreadAttribute 특성을 사용하여 앱의 스레딩 모델을 단일 스레드로 변경해야합니다.
  • 응용 프로그램은 단일 스레드 아파트 모델을 사용하는 COM 구성 요소를 호출할 때

 

 

출처

https://grandmaster.tistory.com/entry/STAThread-넌-누구냐

Understanding and Using COM Threading Models | Microsoft Docs

728x90
반응형

댓글