none
WebBrowser控件使用中,单元模式STA与MTA的疑惑

    问题

  • 我在子线程中用创建了一个Form,Form中包含了一个WebBrowser控件。在VS的调试环境中可以运行,但是会有一个额外的白板(无作用)显示出来。同时,程序发布之后不能正常运行,提示如下异常:



    ************** 异常文本 **************
    System.Threading.ThreadStateException: 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。
       在 System.Windows.Forms.WebBrowserBase.OnHandleCreated(EventArgs e)
       在 System.Windows.Forms.Control.WmCreate(Message& m)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 System.Windows.Forms.WebBrowserBase.WndProc(Message& m)
       在 System.Windows.Forms.WebBrowser.WndProc(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


    ************** 已加载的程序集 **************
    mscorlib
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.17929 built by: FX45RTMREL
        基本代码: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
    ----------------------------------------
    autoBet_alpha
        程序集版本: 1.0.0.0
        Win32 版本: 1.0.0.0
        基本代码: file:///C:/Users/Administrator/AppData/Local/Apps/2.0/NLLLAL44.JLY/KBJMAYLT.YGM/auto..tion_7b3082d9b1b489c2_0001.0000_5b0ae66808cf8836/autoBet_alpha.exe
    ----------------------------------------
    System.Windows.Forms
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.17929 built by: FX45RTMREL
        基本代码: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
    ----------------------------------------
    System.Drawing
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.17929 built by: FX45RTMREL
        基本代码: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
    ----------------------------------------
    System
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.17929 built by: FX45RTMREL
        基本代码: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
    ----------------------------------------
    System.Configuration
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.17929 built by: FX45RTMREL
        基本代码: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
    ----------------------------------------
    System.Xml
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.17929 built by: FX45RTMREL
        基本代码: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
    ----------------------------------------
    mscorlib.resources
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.17929 built by: FX45RTMREL
        基本代码: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/mscorlib.resources.dll
    ----------------------------------------
    System.Windows.Forms.resources
        程序集版本: 4.0.0.0
        Win32 版本: 4.0.30319.17929 built by: FX45RTMREL
        基本代码: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_zh-Hans_b77a5c561934e089/System.Windows.Forms.resources.dll
    ----------------------------------------

    ************** JIT 调试 **************
    要启用实时(JIT)调试,
    该应用程序或计算机的 .config 文件(machine.config)的 system.windows.forms 节中必须设置
    jitDebugging 值。
    编译应用程序时还必须启用
    调试。

    例如: 

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>

    启用 JIT 调试后,任何未经处理的异常
    都将被发送到在此计算机上注册的 JIT 调试器,
    而不是由此对话框处理。
    去除WebBrowser之后,一切正常!!

    在将子线程的单元模式设置为STA后系统正常,为什么呢。STA与MTA有什么本质的区别,两者各适用于什么不同的场所?看似WebBrowser要求运行在STA单元模式下?
    • 已编辑 Jia Black 2016年7月24日 13:52 新的发现
    2016年7月24日 13:37

答案