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

解决方案:

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

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

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

newThread= new Thread(MainFormMessageThread);

            newThread.SetApartmentState(System.Threading.ApartmentState.STA)

            newThread.Name = "ActiveXThread";

            newThread.Start();

或者线程池也可以

ThreadPool.QueueUserWorkItem(new WaitCallback(functionName), Obj);

如果不在单线程单元中,那就声明为单线程单元
给Main函数加上[STAThread]

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {

        }
}

Note:

       在 .NET Framework 1.0 版和 1.1 版中,ApartmentState 属性将线程标记为指示将在单线程单元或多线程单元中执行。当线程处于 Unstarted 或 Running 线程状态时,可以设置此属性;但一个线程只能设置此属性一次。如果尚未设置此属性,则它将返回 Unknown。

 

      在 .NET Framework 2.0 版中,如果在启动新线程之前尚未设置它们的单元状态,则这些新线程将初始化为ApartmentState.MTA。默认情况下,主应用程序线程初始化为 ApartmentState.MTA。无法再通过在第一行代码上设置 System.Threading.ApartmentState 属性将主应用程序线程设置为 ApartmentState.STA。应改用 STAThreadAttribute。

 

     在 .NET Framework 1.0 和 1.1 版中,可以通过使用 System.Threading.ApartmentState 属性在线程运行之后设置单元状态;这样会创建争用条件。在 .NET Framework 2.0 版中,这是不允许的。

COM 组件使用单元来同步对资源的访问。与之相对,托管对象使用同步区域、同步基元和同步上下文来确保以线程安全的方式使用所有共享资源,其中同步基元指互斥体、锁和完成端口等对象。有关 .NET 线程模型的其他信息,请参见托管线程处理。

为了实现互用性,公共语言运行库将在调用 COM 对象时创建一个单元并将其初始化。托管线程可以创建并进入只包含一个线程的单线程单元 (STA) 或包含一个或多个线程的多线程单元 (MTA)。当 COM 单元与线程所生成的单元兼容时,COM 将允许调用线程直接调用 COM 对象。如果这两种单元不兼容,COM 将创建一个兼容的单元并通过代理将所有调用封送在新的单元中。

运行库调用 CoInitializeEx 将 COM 单元初始化为 MTA 或 STA 单元。在 .NET Framework 2.0 版中,如果未在启动线程之前设置托管线程的单元状态,则托管线程会被初始化为 MTA。在启动线程之前可使用 SetApartmentState 或 TrySetApartmentState 方法设置单元状态。

在 .NET Framework 2.0 版中,除非将 STAThreadAttribute 应用于入口点过程,否则主应用程序线程会被初始化为 MTA。

下表将列出 ApartmentState 枚举值并显示可比的 COM 单元初始化调用。

ApartmentState 枚举值

COM 单元初始化

MTA

CoInitializeEx(NULL, COINIT_MULTITHREADED)

STA

CoIntializeEx(NULL, COINIT_APARTMENTTHREADED)

未知

CoInitializeEx(NULL, COINIT_MULTITHREADED)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值