关于 C# WebBrowser 当前线程不在单线程单元中,因此无法实例化 的错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 C# WebBrowser 当前线程不在单线程单元中,因此无法实例化 的错误相关的知识,希望对你有一定的参考价值。

WebBrowser 控件是在一个dll的窗口里
我在其他的程序对这个窗口进行调用,发现不管我是在主线程或线程中去调用,都会引起当前线程不在单线程单元中,因此无法实例化 的错误。

我的最初想法是在一个线程中进行调用,部分代码如下:

C# code

Thread threadPop = new Thread(new ThreadStart(GetPopTask)); threadPop.IsBackground = true; threadPop.SetApartmentState(ApartmentState.STA); threadPop.Start();

C# code

private void GetPopTask() from1.Form1 frm = new from1.Form1(); frm.SetSize(200), int.Parse(100)); frm.Show();

我在网上查阅过其他人的解决办法,但是不知道为什么我没有能 "抄袭" 成功
1.我在程序最初的入口写下这些,也没有用

C# code

[STAThread] static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new ADMain()); Thread.CurrentThread.ApartmentState = ApartmentState.STA; Application.Run(new ADMain());

非常迫切的希望知道解决之道.把全部的分都拿上来了
kingson88 能不能给个较完整的代码或是例子啊?
我的邮箱:zchwork@21cn.com,

dll里的WebBrowser 调用了Navigate 而这个DLL启用的线程导致的这个错误,通过委托的方式解决,只要是跨线程刷新界面都会出错, 意思是只要线程了使用的数据赋值到界面上都会出现这样的错误.都可以通过委托解决!改写Navigate :
public delegate void DelUserHandler(string url);

public void NavigateUrl(string url)

if (this.webbrowser1.InvokeRequired)

DelUserHandler handler = new DelUserHandler(NavigateUrl);
this.Invoke(handler, url);

else

this.webbrowser1.Navigate(url);

参考技术A 1.在使用WebBrowser的地方声明一个WebBrowser,dll里提供一个函数返回WebBrowser.再使用这个WebBrowser.

2.在使用WebBrowser的地方声明并创建一个WebBrowser,然后dll里需要用WebBrowser的类用构造函数的参数把它传进去
没有验证过,只是我的想法,不知可行不.
参考技术B 我记得在学C的时候,有这样一条,就是父程序和其他程序无法调用子程序的变量,你可以尝试把这个文件分割出来 以供全局调用!
C语言以前学过 3年没用了 你的 意思我大概明白了 我不知道我的想法能不能管用 希望可以!

需要 C# Winforms 自定义 WebBrowser 控件

【中文标题】需要 C# Winforms 自定义 WebBrowser 控件【英文标题】:C# Winforms Custom WebBrowser Control Needed 【发布时间】:2011-04-28 16:10:09 【问题描述】:

我最近一直在网上搜索一个现有的控件,该控件的作用类似于网络浏览器控件,具有一些我需要的特定功能。

我还没有找到有它们的,所以我想在这里留下一个问题,希望有人能指出我如何做到这一点,或者甚至给我一些关于如何从头开始创建的提示,最终将成为解决方案。

我需要一个允许我预览网页的控件,同时它允许我以编程方式对其进行编辑。我不需要将 HTML 或文本直接写入编辑器,但需要能够单击按钮,并将特定的 HTML 代码插入到文档中,并刷新预览。

我还需要能够捕获控件上的点击事件。例如,我想单击控件上的特定位置并获取位于鼠标位置的 HTML 元素。关于事件,我还需要能够捕获拖放,而且浏览器控件本身似乎也不支持这一点。

尽管我尝试了一些不同的控件,但它们都没有这些功能,或者允许我添加它们。所以,如果有人能指出我正确的方向,或者如果我错误地假设无法使用任何现有的 .NET 控件来完成,我将不胜感激。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

两个建议:

在浏览器的客户端有 DOM 访问器,可以让您通过鼠标位置获取 HTML。查看此页面以进行演示:

http://www.permadi.com/tutorial/cssGetElementUnderMouse/index.html

大概您可以将 javascript 写入您的 HTML 中,其中包含挂钩以在您的父 UI 代码中引发事件,进而与浏览器交互。从 DOM 中获取 HTML 元素名称并将其传递回 UI,UI 将其用作 HTMLDocument 中的光标,这将是一个好的开始。

您可以从那里扩展该模型以支持诸如拖放或动态刷新之类的想法或您拥有的东西。

我不知道有什么开箱即用的方法。我确实环顾四周,发现了这个工具,它自称为免费并提供源代码,但我不知道它的许可模式是什么,所以联系作者

http://kompozer.net/features.php

【讨论】:

我没能回答这个帖子,但是 kompozer 似乎不是一个与 C# 一起使用的组件,而是一个独立的工具本身。我又开始搜索了,因为 ModelText 让我发疯了。我在尝试添加一些 HTML 时遇到了一些“意外”错误,这些错误并没有为我提供有关如何修复任何问题的大量信息。【参考方案2】:

据我所知,没有这样的控制。此外,从头开始编写一个能够正确呈现所有现代 HTML/CSS 的程序将是一项艰巨的任务。

即使是像 Microsoft Expression 这样的产品,在显示正在编辑的 HTML 的方式上也往往有一些怪癖。

恐怕你的工作已经完成了。

【讨论】:

是的,实际上我已经考虑过......创建一个使用 CSS 呈现 HTML 的控件确实不容易。但是那里有一些控件,它们似乎比浏览器控件做更多的事情,我怀疑它们是从头开始的...... @BlunT:嗯,有开源渲染引擎。因此,您可以采用类似的方法并对其进行修改以允许编辑。但我或多或少地从头开始考虑这一点,因为您需要使用原始源代码,而不仅仅是使用组件。【参考方案3】:

查看http://www.modeltext.com/html/

【讨论】:

ModelText 是我尝试过的控件之一,并使用他们提供的示例进行了测试。我已经尝试过捕捉事件,但我不能,但现在我又尝试了一次,似乎至少可以让一些部分工作。我会再深入一点,让你知道它是否能够满足我的所有需求。你有这个控件的经验吗,或者如果我有任何疑问可以去哪里讨论? 我以前从未使用过它。我希望它能奏效,因为它听起来很有用。 我在以编程方式设置 HTML 的内容时遇到了一些问题,但是当我单击页面时,我设法捕获了 HTML 控件的事件。这是一个开始!

以上是关于关于 C# WebBrowser 当前线程不在单线程单元中,因此无法实例化 的错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中更改 WebBrowser 的 URL

网络浏览器控制限制

C# CefSharp 如何获取当前页的URL

c# webBrowser如何获取弹出提示框内容并模拟点击?

C#的网页控件WebBrowser如何指定内核为IE8?

C# webbrowser cookie