STA 또는 MTA 스레드 코드를 특정 COM 인터페이스 포인터를 사용하는 능력은 모든 택시에서이 스레드에서이 포인터를 얻을 여부에 따라 달라집니다. STA (또는 MTA) 스레드에서 포인트를 얻을 수 있다면 다른 아파트로 직접 전달하지 않는다면 추가로 사용하는 것이 좋습니다.
COM 서버가 아파트 유형 불일치 (일반적인 경우 : STA 스레드 및 COM 서버가 "무료"아파트 모델을 사용하여 등록됨)로 인해 포인터를 얻을 수없는 방식으로 등록 된 경우 COM은 포인터를 마샬링하려고 시도합니다. 당신. 마샬링이 성공하면 코드가 포인터를 받고 거기에서부터 시작하는 것이 좋습니다. 그렇지 않으면 오류가 발생하고 다른 아파트에서 동일한 작업을 수행하려는 시도가 성공합니다. 기본적으로 STA 또는 MTA 스레드에서 특정 COM 인터페이스를 사용할 수있는 경우에 대한 대답을 얻는 유일한 신뢰할 수있는 일반 메서드입니다.
는 COM 개체를 인스턴스화의보다 구체적인 경우에, 당신은 인스턴스화 아파트 유형과 일치 여부를 확인하기 위해 레지스트리 정보를 찾아 볼 수 있습니다. out-of-process 서버는 모든 이벤트에서 마샬링을 통해 COM 인터페이스 포인터를 제공하므로 모든 클라이언트 측 아파트에서이 서버를 사용할 수 있습니다.
서버 오브젝트는 스레드로부터 안전 여부에 의심의 여지가 없다. COM 등록이 정확하면 (특히 STA in-proc 서버가 Free/Both 등록을 알리지 않고 마샬링을 사용할 수있는 경우) 스레드 안전이 무료로 포함됩니다.
고마워요! 나는 COM 관련 자료에 깊이 관여하지 않기 때문에 모든 점을 이해하지 못한다. COM 객체를 전혀 사용하지 않지만 일부 코드는 COM을 사용하는 것 같습니다. 예를 들어, vb.net이 STA를 기본값으로 사용하고 메시지 루프가 thread.Sleep에 의해 차단 되었기 때문에 차단 된 Finalizer가 있습니다. 내가 안전하게 MTA (기본값은 C#)로 바꿀 수 있으며 이후에는 더 이상 신경 쓰지 않아야 함을 확신합니다.). 그러나 많은 조사가 끝난 후에도 이것이 어떻게 든 내 코드를 손상시킬 수 있는지 확실하지 않습니다. – DanielG
COM의 규칙은 아파트간에 직접 포인터를 전달하지 않는다는 것입니다 (일반적으로 STA 스레드에서는 포인터를이 스레드 외부로 가져올 수 없으며 MTA 스레드간에 포인터를 전달할 수 있지만 외부에서는 STA 스레드로 전달할 수 없음). VB.NET 코드에서 COM 인터페이스를 처리 할 때이를 명심해야합니다. .NET 런타임은 추가 검사를 수행하고 포인터의 오용을 방지하므로 모든 단계를 제외하면 예외가 발생할 수 있습니다. –