Code Bye

无法实例化 ActiveX 控件

1.错误提示:

错误:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常

网上大部分有个比较通用的方法:

public class Invoker
   {
       public OpenFileDialog InvokeDialog;
       private Thread InvokeThread;
       private   DialogResult InvokeResult;

       public Invoker()
       {
           InvokeDialog = new OpenFileDialog();
           InvokeThread = new Thread(new ThreadStart(InvokeMethod));
           InvokeThread.SetApartmentState(ApartmentState.STA);
           InvokeResult = DialogResult.None  ;
       }

       public DialogResult Invoke()
       {
           InvokeThread.Start();
           InvokeThread.Join();
           return InvokeResult;
       }

       private void InvokeMethod()
       {
           InvokeResult = InvokeDialog.ShowDialog ();
       }
   }

2.错误提示:

当前线程不在单线程单元中,因此无法实例化 ActiveX 控件—{“当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“3c33f325-cd56-4005-9e34-d0c6ab70b1eb”。”}

解决方案:

1、在主线程中实例化此ActiveX控件

2、将创建此Active控件的线程设定为单线程。

     Thread.ApartmentState 获取或设置此线程的单元状态。

           serviceFormThread = new Thread(MainFormMessageThread);

           serviceFormThread.ApartmentState = ApartmentState.STA;          //最关键的一句

           serviceFormThread.Name = “InfraServiceThread”;

           serviceFormThread.Start();

        当您启动托管的线程由默认线程不进入任何 COM 单元。 从线程进行第一个 COM 调用时,托管的线程隐式进入公寓。 默认,托管的线程进入多线程的单元 (MTA) 进程。 托管的线程进入 COM 单元后,它不能将保留,并输入另一个单元。 可以通过以下方法之一来使输入单线程单元 (STA) 的托管的线程:

1)应用程序的主方法上指定 [STAThread] 指令。 将此方法在执行时 ApartmentState 属性设置为该线程为 STA 。

2)设置 System.Threading.ApartmentState.STA Thread.ApartmentState 。 这将导致线程输入一个 STA。 如果将 Thread.ApartmentState 设置为System.Threading.ApartmentState.MTA ,该线程将进入 MTA。

3)使用在 AspCompat =”true” ASPX 页上页指令,以使线程输入一个 STA中的属性。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明无法实例化 ActiveX 控件