C# 它不见了,但它就在那里
以下是我尝试在程序中打开OpenFileDialog时收到的错误消息: “当前线程必须设置为单线程 OLE之前的线程单元(STA)模式 可以拨打电话。请确保您的 Main函数具有stathreadsattribute属性 已在其上标记。此例外仅适用于 如果将调试器附加到,则引发 过程。” 这个错误消息的问题是,我的Main方法确实附加了STAThread属性。我不知道如何处理这件事。如果已经存在,我如何添加内容。将它加倍不是一个好的选择,我尝试删除它,构建应用程序,添加它,然后再次构建它,但没有成功。我只是不明白C# 它不见了,但它就在那里,c#,C#,以下是我尝试在程序中打开OpenFileDialog时收到的错误消息: “当前线程必须设置为单线程 OLE之前的线程单元(STA)模式 可以拨打电话。请确保您的 Main函数具有stathreadsattribute属性 已在其上标记。此例外仅适用于 如果将调试器附加到,则引发 过程。” 这个错误消息的问题是,我的Main方法确实附加了STAThread属性。我不知道如何处理这件事。如果已经存在,我如何添加内容。将它加倍不是一个好的选择,我尝试删除它,构建应用程序,添加它,然后再次构建它,但没有
private void btnOldFind_Click(object sender, EventArgs e)
{
openFileDialog1.Multiselect = false;
openFileDialog1.FileName = "";
openFileDialog1.ShowHelp = false;
openFileDialog1.AutoUpgradeEnabled = true;
openFileDialog1.InitialDirectory = @"C:\";
openFileDialog1.Filter = "Microsoft Installer (*.msi)|*.msi|All Files (*.*)|*.* ";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBoxOldInstallation.Text = openFileDialog1.FileName;
}
}
主要方法是:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
静态类程序
{
///
///应用程序的主要入口点。
///
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新Form1());
}
}
并且没有显式地执行线程。老实说,这只是一个相当基本的程序
编辑2::
下面是完整的错误消息,包括调用堆栈
System.Threading.ThreadStateException未处理
Message=“在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。请确保主函数上标记了STAThreadAttribute。只有在将调试器附加到进程时才会引发此异常。”
Source=“System.Windows.Forms”
堆栈跟踪:
位于System.Windows.Forms.FileDialog.RunDialog(IntPtr hWndOwner)
位于System.Windows.Forms.CommonDialog.ShowDialog(iwin32窗口所有者)
在System.Windows.Forms.CommonDialog.ShowDialog()中
在MSI_Comparison_GUI.Form1.btnOldFind_中,单击c:\tfs\DocuWare.NET\DocuWare NewGen\src\Tools\MSI_Comparison\MSI_Comparison_GUI\Form1.cs中的(对象发送方,事件参数e):第70行
在System.Windows.Forms.Control.OnClick(EventArgs e)中
在System.Windows.Forms.Button.OnClick(EventArgs e)中
在System.Windows.Forms.Button.OnMouseUp(MouseEventArgs-mevent)上
在System.Windows.Forms.Control.WmMouseUp(Message&m、MouseButtons按钮、Int32单击)
位于System.Windows.Forms.Control.WndProc(Message&m)
位于System.Windows.Forms.ButtonBase.WndProc(Message&m)
在System.Windows.Forms.Button.WndProc(Message&m)中
在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)中
在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&m)中
在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam)
在System.Windows.Forms.UnsafentiveMethods.DispatchMessageW(MSG&MSG)中
位于System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafentiveMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID、Int32 reason、Int32 pvLoopData)
位于System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32原因,ApplicationContext上下文)
位于System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32原因,ApplicationContext上下文)
在System.Windows.Forms.Application.Run(Form mainForm)中
在c:\tfs\DocuWare.NET\DocuWare NewGen\src\Tools\MSI\u Comparison\MSI\u Comparison\GUI\Program.Main()中的MSI\u Comparison\u GUI.Program.Main()处:第18行
位于System.AppDomain.\u nexecutestAssembly(程序集,字符串[]args)
位于System.AppDomain.ExecuteAssembly(字符串汇编文件、证据汇编安全性、字符串[]args)
在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()上
位于System.Threading.ThreadHelper.ThreadStart\u上下文(对象状态)
在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)
位于System.Threading.ThreadHelper.ThreadStart()处
内部异常:
没有代码就不能说。如果是控制台应用程序,请在调用该方法之前添加以下内容:
Console.Write(System.Threading.Thread.CurrentThread.ApartmentState);
否则,
MessageBox.Show(System.Threading.Thread.CurrentThread.ApartmentState);
然后查看线程单元的实际状态。尝试在主过程、对话框的创建点和使用点设置断点。然后看看你实际上在哪个线程中。另外,检查
Thread.CurrentThread.GetApartmentState()
在这些点上的值。可能是您在Connect1上遇到了以下报告的问题:
根据该问题,当您的输出文件夹中同时存在myprogram.exe和myprogram.dll文件时,Visual Studio的宿主进程(即myprogram.vshost.exe)强制执行错误的单元状态
这个问题可能是某些较旧版本的VisualStudio(2005)所特有的,我还无法使用VS2010复制它
显而易见的解决方法是更改dll的名称或将dll移动到另一个文件夹
出现这种情况可能是因为您将项目的输出类型从类库更改为Windows应用程序
1目前尚不清楚此问题是否已由Microsoft确认,它只是说问题不在VS产品团队的责任范围内。您得到了一个不可能的堆栈跟踪。很明显,线程不是问题的原因,一切都在主线程上运行,主方法上的[StatThread]属性正在设置单元状态。堆栈跟踪显示它确实是入口点 好吧,坏消息是,一些附加组件正在与您的主线程发生冲突。做一些讨厌的事情,比如打电话太多。我曾经遇到过这种事,我花了一个月的时间才找到它。使用Project+属性、调试选项卡开始诊断此问题,勾选“启用非托管代码调试”。这可以让您查看正在加载的DLL
t.SetApartmentState(ApartmentState.STA);