Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 它不见了,但它就在那里_C# - Fatal编程技术网

C# 它不见了,但它就在那里

C# 它不见了,但它就在那里,c#,C#,以下是我尝试在程序中打开OpenFileDialog时收到的错误消息: “当前线程必须设置为单线程 OLE之前的线程单元(STA)模式 可以拨打电话。请确保您的 Main函数具有stathreadsattribute属性 已在其上标记。此例外仅适用于 如果将调试器附加到,则引发 过程。” 这个错误消息的问题是,我的Main方法确实附加了STAThread属性。我不知道如何处理这件事。如果已经存在,我如何添加内容。将它加倍不是一个好的选择,我尝试删除它,构建应用程序,添加它,然后再次构建它,但没有

以下是我尝试在程序中打开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);