当前线程不在单线程单元中,因此无法实例化 ActiveX 控件

最近项目的程序修改 需要使用COM控件 由三个DLL组成 其中两个是语言包

由于前期项目已经在客户那里安装 只要能自动更新就行了 我们这个程序是的机制是先由一个项目的Splash窗体来自动更新 然后利用Assembly来反射动态加载登录窗体的那个项目 然后用Activator.CreateInstance来创建出登录窗体,我需要在登录窗体里加载COM控件,于是我在登录窗体里写了注册这个COM组件的方法也正常,但到了实例化那个COM组件时就报错:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件,想了很多办法无法解决,希望大家帮忙解决下。

项目A为启动项目,在A中的启动窗体中利用Assembly反射项目B中的一个窗体,在项目B的这个窗体里注册COM,加载COM控件,代码执行到COM控件实例化时报错:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
C# WinForm 我已经在A、B的program的Main方法里添加的[STAThread] 还是不行

cuirunxing 我的A和B 是两个Windows应用程序 不是类库 ,当然会有各自的Program文件, Program当然会有Main方法。。。。

第1个回答  2011-01-17
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);

}}本回答被网友采纳
第2个回答  2011-01-17
首先,使用 STA COM 组件可能大大损害性能,应尽量避免。若必须使用 STA COM 组件,如在任何 interop 方案中,则应在执行期间进行大量调用并在每次调用期间发送尽可能多的信息。

其次,针对你这个问题,请问为什么要在A,B项目都声明Main方法。如果你在B项目中不声明Main方法,而是创建B项目的中的实例,上面的问题就解决了。
第3个回答  2011-01-09
给Main()方法加上STAThreadAttribute特性试一试:
[STAThread]
static void Main(string[] args)
{
}本回答被网友采纳
第4个回答  2011-01-10
同意楼上的,我以前还遇到一个ASP.net环境下的,也有此问题!

当前线程不在单线程单元中,因此无法实例化 ActiveX 控件,应该怎么...
dll里的WebBrowser 调用了Navigate 而这个DLL启用的线程导致的这个错误,通过委托的方式解决,只要是跨线程刷新界面都会出错, 意思是只要线程了使用的数据赋值到界面上都会出现这样的错误.都可以通过委托解决!改写Navigate : \\x0d\\x0apublic delegate void DelUserHandler(string url); \\x0d\\x0a\\x0...

当前线程不在单线程单元中,因此无法实例化 ActiveX 控件,应该怎么...
dll里的WebBrowser 调用了Navigate 而这个DLL启用的线程导致的这个错误,通过委托的方式解决,只要是跨线程刷新界面都会出错, 意思是只要线程了使用的数据赋值到界面上都会出现这样的错误.都可以通过委托解决!改写Navigate :public delegate void DelUserHandler(string url);public void NavigateUrl(string u...

C#当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
创建和访问控件 都必须在UI线程中,如果涉及多线程时,在子线程中访问和实例控件可以这样:this.Dispatcher.BeginInvoke(new Action(() => { 创建或访问控件语句 }));

当前线程不在单线程单元中,因此无法实例化 ActiveX 控件
参考答案:当父母老了:不要责难他们大小便失禁弄脏了衣裤,他们也曾因此为你擦屎端尿;不要怪他们弯腰驼背脚步迟缓,他们也曾扶着你直起腰杆蹒跚学步;不要嫌弃他们把饭菜与口水流在衣服上,他们也因此为你喂过饭;不要烦他们言语唠叨含混不清,因为你曾牙牙学语,叽叽喳喳,他们却当动听歌来听。

关于C# WebBrowser 当前线程不在单线程单元中,因此无法实例化 的...
dll里的WebBrowser 调用了Navigate 而这个DLL启用的线程导致的这个错误,通过委托的方式解决,只要是跨线程刷新界面都会出错, 意思是只要线程了使用的数据赋值到界面上都会出现这样的错误.都可以通过委托解决!改写Navigate :public delegate void DelUserHandler(string url);public void NavigateUrl(string ...

您好,请教关于dll中的activex控件实例化出错的问题
我最近也在做DLL的active控件,引用后偶尔也会出问题 一般出无法实例化,就是两种:1.本身JS的问题,使得OBJECT实例化之前就出了JS错误.2.本身OBJECT初始化失败.看您这问题完全就要在C#的程序中找了

Windows Service 中使用 ocx 控件
OCX控件是一个AX界面控件,可能没有办法在service这样的后台无界面的程序里创建。如果service是必须的,那么就试试搞一个remoting服务器,用一个winform程序做宿主,然后在这个程序里实现功能。service通过remoting向这个程序发信息。或是通过消息队列向一个winform程序发信息,由这个winform程序来创建ocx,完成...

打网页的时候出来ATL是什么意思?
另外,在MFC中还提供对Automation 和 ActiveX Control的支持,对于这两个方面,Visual C++也提供了相应的AppWizard和ClassWizard支持,这种可视化的工具更加方便了COM应用的开发。 MFC对COM和OLE 的支持确实比手工编写COM程序有了很大的进步。但是MFC对COM的支持是不够完善和彻底的,例如对COM接口定义的IDL语言,MFC并没有任...

Asp,php,jsp在网站中各是起什么作用的?
由于线程与线程之间可以通过生成自己的父线程(Parent Thread)来实现资源共享,这样就减轻了服务器的负担,所以,Java Servlet可以用来做大规模的应用服务。虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSP Parser)...

C++中有哪些保留字?它们分别得含义是什么?
volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:label:mov ax,signal if(ax!=1)goto label 注意:一个参数既...

相似回答