我想在.NET Compact Framework 3.5项目中使用WebBrowser
组件。我遇到了有关此问题的矛盾信息。
如果我只是尝试使用它,我会得到以下异常:
System.Threading.ThreadStateException: ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment.
at System.Windows.Forms.WebBrowserBase..ctor(String clsidString)
at System.Windows.Forms.WebBrowser..ctor()
at dce.pd.dialogmgr.baseimpl.DialogDeviceImpl.createGui(XmlElement pDialogManagerNode) in C:\sourceview\CS.NETCF.2008\dce\pd\dialogmgr\baseimpl\DialogDeviceImpl.cs:line 362
at dce.pd.dialogmgr.baseimpl.DialogDeviceImpl.init() in C:\sourceview\CS.NETCF.2008\dce\pd\dialogmgr\baseimpl\DialogDeviceImpl.cs:line 118
at dce.pd.dialogmgr.thinimpl.ThinClient.createDeviceImpl() in C:\sourceview\CS.NETCF.2008\dce\pd\dialogmgr\thinimpl\ThinClient.cs:line 82
at dce.pd.dialogmgr.thinimpl.ThinClient.init() in C:\sourceview\CS.NETCF.2008\dce\pd\dialogmgr\thinimpl\ThinClient.cs:line 87
at dce.pd.dialogmgr.thinimpl.ThinClient.form_Load(Object sender, EventArgs e) in C:\sourceview\CS.NETCF.2008\dce\pd\dialogmgr\thinimpl\ThinClient.cs:line 66
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
对我来说,这听起来像我必须将[STAThread]
指令放到我的Main
方法中。
[STAThread]
static void Main()
{
...
}
但这既不起作用,因为the [STAThread] option is not available in compact framework.。所以,应用程序现在甚至都不会编译。
然而,根据Microsoft's documentation,WebBrowser
组件可用于紧凑框架项目。甚至有一些例子。 (遗憾的是,未提供完整代码)。
那么,我错过了什么?
答案 0 :(得分:2)
我终于在这里发现了什么错误。
实际上,当我尝试直接在笔记本电脑上运行已编译的可执行文件时,上面的例外(即System.Threading.ThreadStateException: ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment.
)才会出现。
模拟器不适合我。我终于让模拟器正常工作了。我意识到我必须选择一个“模拟器”设备,它的名称以“模拟器”结尾。 (例如“Windows Mobile 6 Emulator”)。您需要在测试之前使用工具栏中的“连接到设备”按钮连接这些设备。建立连接后,应用程序实际上在模拟器上运行正常。
问题仍然存在:为什么应用程序不能直接在我的笔记本电脑上运行,而它在模拟器中运行良好。但这是一个不同的问题。
当然操作系统是不同的。但我的印象是,系统使用不同版本的.NET框架。以前我错误地认为所有紧凑的框架应用程序也可以在完全成熟的.net框架的笔记本电脑上运行。现在看来这是不正确的。