C# 코드에서 호출 할 외부 구성 요소 (C++)가 있습니다.C# STAThread COMException
코드는이 같은 것입니다 : 그래서 문제가 처음에는 잘 작동하고 호출이다
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace dgTEST
{
class Program
{
[STAThread]
static void Main(string[] args)
{
ExtComponentCaller extCompCaller = new ExtComponentCaller();
result = extCompCaller.Call(input);
Thread t = new Thread(new ThreadStart(() =>
{
try
{
result = extCompCaller.Call(input);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
}
}
라는 외부 구성 요소는, 나는 결과를 다시 얻었다.
그러나 다른 스레드에서 호출하려고하면 예외가 발생합니다. System.InvalidCastException : 'System .__ ComObject'형식의 COM 개체를 캐스팅 할 수 없습니다. STAThread 때문에이 예외가 throw 된 것이 확실합니다. Main 함수에서 [STAThread] 특성을 제거하면 정상적으로 작동 한 외부 구성 요소의 첫 번째 호출과 동일하게 발생합니다.
이 예외를 제거하기 위해 다른 스레드에서이 외부 구성 요소를 호출하려면 어떻게해야합니까?
UPDATE는 -------------
다른 미친 것은 이제 발생합니다. Visual Studio에서 F5 키를 눌러 프로그램을 시작하면 첫 번째 호출에서도 문제가 발생하지만 바이너리 .exe 파일을 직접 실행하면 다른 스레드에서 작동하지 않습니다.(). 놓고 F5와 비주얼 스튜디오에서 시작, 첫 번째 전화가 다시 작동하는 디버그에서 빌드를 전환 할 수 있습니다.
이이 왜 발생합니까?
감사를 사전에 도움을!
안부, Zoli
STA로 표시된 작성한 스레드에서 전체 작업 (COM 인스턴스 만들기 및 메서드 실행)을 수행하면 어떻게됩니까?이 COM 개체가 레지스트리에서 STA로 표시되고 다른 COM 아파트 (MTA에서 STA로 또는 STA에서 MTA로)에서 제대로 작동하지 않을 가능성이 있습니다 (코드화 된 방식의 버그로 인해). –
동일한 예외가 있습니다 :. 하지만 Main 함수는 스레드가 생성되는 STA입니다 .STA로 설정된 스레드도 이해할 수 없으므로 –
이것은 구성 요소의 버그로 인해 발생할 수 있습니다. 모든 단일 STA 스레드에서 수행됩니다 작동합니다. –