-2

我得到“当前线程必须设置为单线程单元 (STA) 模式,然后才能进行 OLE 调用。确保您的 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;

}

程序.cs

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

    }
4

2 回答 2

0

确保您的Main功能已STAThreadAttribute在其上标记。

或者,如果您在另一个线程上运行您的 UI 代码,请使用某种机制在主线程上调用它(例如BeginInvoke)。

至于为什么保存文件对话框需要单线程单元模型背后的技术原因,它源于使用 Windows Shell 的通用文件对话框。第三方扩展可以在这里加载,他们期望单线程单元线程模型。

尽管它是为 C++ 开发人员编写的,但备注部分ShellExecute提供了有关此要求的一些很好的信息。

于 2013-02-14T09:04:41.977 回答
-1

解决方案 1

STAThread在您的 Main 方法上方使用。

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

{

}

解决方案 2

如果解决方案不起作用,请清洁您的解决方案。还要交叉检查所有 dll 是否真的被删除。转到您的调试文件夹并dll从那里删除任何旧的/陈旧的。然后再次重建您的解决方案,现在一切都应该好了。

我的经验表明......大多数时候,解决方案 2 工作正常。

于 2013-02-14T09:38:48.383 回答