c#中的winform工具中存在STA错误
本文关键字:存在 STA 错误 工具 中的 winform | 更新日期: 2023-09-27 17:59:15
Am-geting"在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。请确保Main函数上标记了STAThreadAttribute。只有当调试器附加到进程时才会引发此异常"error。这是以下代码。
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());
}
确保Main
函数上已标记STAThreadAttribute
。
或者,如果您在另一个线程上运行UI代码,请使用某种机制在主线程上调用它(例如BeginInvoke
)。
至于为什么保存文件对话框需要单线程单元模型背后的技术原因,它源于使用Windows Shell的通用文件对话框。第三方扩展可以在这里加载,并且他们期望单线程单元线程模型。
ShellExecute
的备注部分提供了一些关于此需求的好信息,尽管它是为C++开发人员编写的。
解决方案1
使用主方法之上的STAThread
。
[STAThread]
static void Main(string[] args)
{
}
解决方案2
如果溶液不起作用,请清洁溶液。还要交叉检查是否真的删除了所有dll。转到调试文件夹并从中删除任何旧的/过时的dll
。然后重新构建您的解决方案,现在一切都应该正常。
我的经验表明。。。。大多数情况下,解决方案2运行良好。