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

解决方案 »

  1.   

    UI ActiveX控件只能用于单元线程窗体程序,ASP.NET程序不支持
    ActiveX对象的声明放到主线程中.  
    .ScriptErrorsSuppressed = true;  
    对此对象的操作可以继续在其他线程 主线程MAIN函数要加
    [STAThread]以表示应用程序的 COM 线程模型是单线程单元  
      

  2.   

    在Main()里初始化COM,因为Main线程是[STAThread]线程
      

  3.   

    http://msdn.microsoft.com/zh-cn/library/system.threading.thread.setapartmentstate(v=VS.80).aspx Thread t = new Thread(ThreadProc);
            Console.WriteLine("Before setting apartment state: {0}", 
                t.GetApartmentState());        t.SetApartmentState(ApartmentState.STA);
            Console.WriteLine("After setting apartment state: {0}", 
                t.GetApartmentState());        bool result = t.TrySetApartmentState(ApartmentState.MTA);
            Console.WriteLine("Try to change state: {0}", result);        t.Start();新建线程时先将线程设为单线程单元ApartmentState.STA,然后再运行在启动新线程之前尚未设置它们的单元状态,则这些新线程将初始化为 ApartmentState.MTA。必须在启动线程之前设置单元状态