在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

用 C# 写了一个服务,为了能够方便调试,于是又写了一个 winform 程序。当我在这个程序中打开一个文件对话框时,出现了如下错误。

img

解决方案

通过寻找相关资料,了解到了STA单元模式和COM对象,总的来说:winform中,很多控件是COM对象,这样的对象只能被sta模式中的线程所调用。

解决办法有两种:

  • 第一种:在主方法上加上[STAThread]特性标签

    1
    2
    3
    4
    5
    6
    7
    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new LogInForm());
    }
  • 第二种:将线程的单元状态设置为单线程单元,thread.SetApartmentState(ApartmentState.STA)

    1
    2
    3
    Thread th = new Thread(()=> new Form1().ShowDialog());
    th.SetApartmentState(ApartmentState.STA);
    th.Start();

在代码里面,我的 Main 已经声明了 [STAThread] 特性,但是依然报错,我想,可能是因为是服务的问题。最后采用了第二种方法解决了。

特此记录,以免今后遗忘。

致谢

本文摘抄至:妄揽明月