[ad_1]
誰か助けてくれませんか。
Windows アプリケーションを Visual Studio 2003 から 2005 にアップグレードしています。変換ウィザードを実行し、いくつかのメソッドを変更/書き換えた後、アプリをコンパイルしました (VS 2003 では既に完全に動作しています)。
ただし、2005 年に接続されたデバッガーを使用してプロジェクトを実行し、以下のコードを実行する[ファイルを開く]ダイアログ ボックスを選択すると、エラーが発生します。 「OLE 呼び出しを行う前に、現在のスレッドをシングル スレッド アパートメント (STA) モードに設定する必要があります。メイン関数に STAThreadAttribute がマークされていることを確認してください。この例外は、デバッガーがプロセスに接続されている場合にのみ発生します。」.
スタック トレースは次のように表示されます。
System.Windows.Forms.FileDialog.RunDialog (IntPtr hWndOwner) で
System.Windows.Forms.CommonDialog.ShowDialog (IWin32Window 所有者) で
System.Windows.Forms.CommonDialog.ShowDialog() で
C:\Documents and Settings\*****\My Documents\Visual Studio 2005\*****Accounts App V2 database upgrade\frmmain.vb:line 379 の Pupil_Accounts_Final_App.frmmain.importbob() で
System.Threading.ThreadHelper.ThreadStart_Context (オブジェクトの状態) で
System.Threading.ExecutionContext.Run (ExecutionContext executionContext、ContextCallback コールバック、オブジェクトの状態) で
System.Threading.ThreadHelper.ThreadStart() で
そこで、フォーム (frmmain) を呼び出す puplicMain クラスに入り、コードを呼び出してスレッド化されたプロセスを開始し、メソッドを呼び出してダイアログを開くためのボタンが配置され、以下のメイン コードに示すように SingleThreadAttribute を追加しましたが、同じエラーがまだスローされます。 次に、この属性をボタン クリック イベントとメソッドに追加しましたが (再度以下に示します)、再び同じ問題が発生しました。
私は解決策を見つけようと数時間 Web を検索してきましたが、BIN ディレクトリ内のすべての古い DLL ファイルを削除することを提案する同様の記事が 1 つ見つかりました。 私の問題が何であるか誰かが知っていますか? MSDN および他のすべての通常のデバッグ方法は、これでは機能しません…
ダイアログを開く方法:
STAThreadAttribute() _<br /> Private Sub importpupils_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnimportbob.Click<br /> 'starts threading to make program appear faster and optomise performance<br /> Dim t As New Thread(AddressOf importbob)<br /> t.Name = "Import Bob"<br /> importPupilsThread = True<br /> t.Start()<br /> End Sub<br /><br /> <STAThreadAttribute()> _<br /> Public Sub importbob()<br /> 'this sub open's a stream reader so bob's master file can be taken into the program<br /> Dim file As FileStream<br /> Dim inputstream As StreamReader<br /> Dim temp As String<br /> Dim item As ListViewItem<br /> Dim i As Integer<br /><br /> open.Filter = "CSV File (*.csv)|*.csv"<br /> If open.ShowDialog = DialogResult.OK Then<br /> Try<br /> file = New FileStream(open.FileName, FileMode.Open)<br /> inputstream = New StreamReader(file)<br /> Catch ex As Exception<br /> MsgBox("A Exception has occured." + vbCrLf + ex.Message)<br /> Exit Sub<br /> End Try<br /> btnimportbob.Enabled = False<br /><br /> Try<br /> Do While inputstream.Peek > -1<br /> temp = inputstream.ReadLine<br /> item = bobslist.Items.Add(temp.Split(",", 11, StringSplitOptions.None)(0))<br /> For i = 1 To 10<br /> item.SubItems.Add(temp.Split(",", 11, StringSplitOptions.None)(i).Trim)<br /> Next<br /> Loop<br /> Catch ex As Exception<br /> MsgBox("A exception has occured. You may have imported the wrong file or the file is corupt" + vbCrLf + ex.Message)<br /> inputstream.Close()<br /> importPupilsThread = False<br /> Exit Sub<br /><br /> End Try<br /> inputstream.Close()<br /> End If<br /><br /> importPupilsThread = False<br /> btnimportseemis.Enabled = True<br /> End Sub
プログラム publicMain へのメイン エントリ ポイント
Module publicmain<br /> Public Const appversion As String = "2.0.0"<br /> Public Const appauthor As String = "*****"<br /> Public Const apptitle As String = "*******"<br /> Public MainForm As frmmain<br /> Public importPupilsThread As Boolean = False<br /> Public importSeemisThread As Boolean = False<br /> Public nextThread As Boolean = False<br /><br /><br /> ' Main entry point in to application<br /> ' Creates new instance of the main form then shows the dialog<br /> <STAThreadAttribute()> _<br /> Sub Main()<br /> MainForm = New frmmain()<br /> MainForm.ShowDialog()<br /> End Sub
解決策 1
やあ、
その目的で STAThreadAttributes を使用できるとは思いません。 考えられる解決策は次の 2 つです。
1.スレッドを開始する前にユーザーとのやり取りを行いますか。
2. または、Thread.Start を呼び出す前に Thread.ApartmentState を設定します。
🙂
[ad_2]
コメント