【解決方法】Visual Studio 2003 から VS 2005 への VB.net Windows アプリケーションのアップグレード

プログラミングQA


誰か助けてくれませんか。

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 を設定します。

🙂

コメント

タイトルとURLをコピーしました