最近C#調用COM時,遇到了異常來自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)的錯誤
后面找了一下,發現是在線程里調用COM組件引起的。
C++調用COM時,會調用API函數CoInitializeEx來初始化COM,這里就指定了初始化為STA(單線程)和MTA(多線程)模式。
C#調用COM組件是用VS直接引用dll,VS應該是默認指定了STA方式,所以要在主線程里運行。
因此我們在線程訪問COM時,需要使用Dispatcher類再封裝一層。
1 private void ThreadOP() 2 { 3 new System.Threading.Thread(DispatcherInvokeCOMOP) { IsBackground = true}.Start(); 4 } 5 6 private void DispatcherInvokeCOMOP() 7 { 8 //使用Dispatcher再封裝一層 9 System.Windows.Application.Current.Dispatcher.Invoke(COMOP); 10 } 11 12 private void COMOP() 13 { 14 //在這里調用COM 15 }
這是WPF的,Winform也有Dispatcher類,調用差不多的。
作者: zhaotianff
轉載請注明出處