怎么改变一个winfrom项目主线程的ApartmentState属性?

白衣如花 2015-10-09 04:58:53
改项目要调用一个dll,dll只有在STA的情况下才能被调用

否则会报错“ActiveX control 'XXX' cannot be instantiated because the current thread is not in a single-threaded apartment.”

但是 这个项目主线程的ApartmentState属性是MTA。。不知道怎么变回来

奇怪的是我新加winform测试项目都是STA的,也不知道当初怎么就成了MTA了
...全文
219 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
白衣如花 2015-10-10
  • 打赏
  • 举报
回复
引用 4 楼 Forty2 的回复:
ApartmentState只能在线程启动设置才有效。 因此,你要异步的话要自己开线程。 而BeginInvoke默认使用线程池线程,不能改变ApartmentState。
多谢,这个问题已经解决了。虽然不能改变项目的ApartmentState,至少我能在调用dll的时候保证是STA不出错了
Forty2 2015-10-09
  • 打赏
  • 举报
回复
ApartmentState只能在线程启动设置才有效。 因此,你要异步的话要自己开线程。 而BeginInvoke默认使用线程池线程,不能改变ApartmentState。
白衣如花 2015-10-09
  • 打赏
  • 举报
回复
引用 2 楼 Forty2 的回复:
先检查你项目中的Program.cs,如果红色部分不在,添上就好了。 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
在的,先不管项目的主线程了,调用dll是在一个委托的异步里面(BeginInvoke),异步委托能主动设置为STA吗,还是它只能是MTA的?
Forty2 2015-10-09
  • 打赏
  • 举报
回复
先检查你项目中的Program.cs,如果红色部分不在,添上就好了。 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }
白衣如花 2015-10-09
  • 打赏
  • 举报
回复
http://q.cnblogs.com/q/12546/此人的遭遇和我一模一样啊。。。也不知道他后来解决了没有

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧