早先遇到一個問題,最近又被問到同樣問題,先做個記錄.
主程式 Load 一個 DLL 檔進來,而 DLL 內有個 Form ,
Form 裡面又用到另一個 COM 元件或另一執行緒,這時會出現以下錯誤 :
[ 目前的執行緒必須先設為單一執行緒 Apartment (STA) 模式,才能進行 OLE 呼叫。請確認您的 Main 函式上已經標記有 STAThreadAttribute ]
解決方式為
1. 在 Class 中先宣告一個全域變數
''宣告一個全域變數 Dim _threadForm As Threading.Thread
2. 加入 Delegate 委派呼叫
''--- 寫法一 直接帶參數的委派呼叫 Private Delegate Sub OpenFormCallback(frm As Windows.Forms.Form) Private Sub OpenForm(frm As Windows.Forms.Form) If frm.InvokeRequired Then frm.Invoke(New OpenFormCallback(AddressOf Me.OpenForm), New Object() {frm}) Else frm.ShowDialog() End If End Sub ''--- 寫法二 不帶參數的委派呼叫 'Private Delegate Sub OpenFormCallback() 'Private Sub OpenForm() ' If FormObject.InvokeRequired Then ' FormObject.Invoke(New OpenFormCallback(AddressOf Me.OpenForm), New Object() {}) ' Else ' FormObject.ShowDialog() ' End If 'End Sub
3. 在要呼叫的 Function 中寫
''--- 寫法一 直接帶參數的委派呼叫 _threadForm = New Threading.Thread(Sub() Me.OpenForm(Me.FormObject)) ''--- 寫法二 不帶參數的委派呼叫 '_threadForm = New Threading.Thread(AddressOf OpenForm) _threadForm.SetApartmentState(Threading.ApartmentState.STA) '將執行緒指定為單一執行緒 _threadForm.Start()
以上,打完,收工,做記錄!