早先遇到一個問題,最近又被問到同樣問題,先做個記錄.
主程式 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()
以上,打完,收工,做記錄!