-2

「OLE 呼び出しを行う前に、現在のスレッドをシングル スレッド アパートメント (STA) モードに設定する必要があります。Main 関数に STAThreadAttribute がマークされていることを確認してください。この例外は、デバッガーがプロセスに接続されている場合にのみ発生します」エラー。これが次のコードです。

if (externalButton.Checked == true)
{
    // int i = 1;
    saveFileDialog.Title = "Save the Proofer Report";
    saveFileDialog.Filter = "Document Files (*.doc)|*.doc|Document Files        (*.docx)|*.docx";
     saveFileDialog.FilterIndex = 0;
     saveFileDialog.InitialDirectory = "MyDocuments";
     saveFileDialog.FileName = "Proofer Report -- " +  Path.GetFileName((string)fileName) + ".doc";
     //i.tostring()
     saveFileDialog.DefaultExt = ".doc"; 

     saveFileDialog.ShowHelp = true;
     saveFileDialog.ShowDialog();-----getting the error here
     fname = saveFileDialog.FileName;
  }
  else
  {
     fname =(string)fileName;              
  }
  if (fname != "")
  {               
     if (worker.CancellationPending == true)
     {
        // report progress
        worker.ReportProgress(25);
        return;

}

Program.cs

     [STAthread]
static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());

    }
4

2 に答える 2

0

Main関数がSTAThreadAttributeマークされていることを確認してください。

または、別のスレッドで UI コードを実行している場合は、なんらかのメカニズムを使用してメイン スレッドで呼び出します (例: BeginInvoke)。

ファイルの保存ダイアログにシングル スレッド アパートメント モデルが必要な理由の背後にある技術的な理由については、Windows シェルを使用した共通ファイル ダイアログに由来します。サード パーティの拡張機能をここで読み込むことができ、それらはシングル スレッドのアパートメント スレッド モデルを想定しています。

備考セクションにShellExecuteは、C++ 開発者向けに書かれていますが、この要件に関する適切な情報が記載されています。

于 2013-02-14T09:04:41.977 に答える
-1

解決策 1

STAThreadMain メソッドの上で使用します。

[STAThread]
static void Main(string[] args)

{

}

解決策 2

ソリューションが機能しない場合は、ソリューションをクリーニングしてください。また、すべての dll が本当に削除されているかどうかをクロス チェックします。デバッグ フォルダーに移動し、そこから古い/古いものを削除しますdll。次に、ソリューションを再構築すると、すべてが正常になるはずです。

私の経験によると....ほとんどの場合、解決策 2 で問題なく動作します。

于 2013-02-14T09:38:48.383 に答える