我写了一个 WinForm,里面用到了一个VB写得OCX控件。OCX的线程模型是“单元线程”。运行正常
我把这个WinForm应用当成SmartClient部署到了IIS(5.0,6.0都测试过)的虚拟目录中,在客户端访问后出现以下错误提示:未处理的“System.Threading.ThreadStateException”类型的异常出现在 system.windows.forms.dll 中。其他信息: 因为当前线程不在单线程单元中,故无法实例化 ActiveX 控件“c88f4186-3315-49f7-a457-668ac723042d”。请问各位大侠这个问题怎么解决?急昐。多谢各位大侠。

解决方案 »

  1.   

    what is your client code? do you have[STAThread]in your application like Main method?[STAThread]
    static void Main()
    {
      //....
    }
      

  2.   

    for 思归:有Attribute [STAThread].如果把这个Attribute改为[MTAThread]则在本地都运行不了,异常跟上边那个一样.如果改为[STAThread]则在本地运行正常,只是部署到IIS后,客户端通过http://hostname/appname.exe访问时会出现上面的异常.
      

  3.   

    你是怎么设置的?如果http://hostname/appname.exe的话,这程序是下载在客户端运行么还是在服务器端运行?
      

  4.   

    不用设置啊.
    你看一下有关SmartClient的东东.在IIS上设置一个虚拟目录,把Windows托管应用部署到此虚拟目录中.通过Url方式访问后,IE不会提示下载该exe(前提是你要装 .net framework而且没有其它的下载工具),而是把此exe运行在一个IEExec.exe的进程里.
      

  5.   

    have you tried to add this code,Thread.CurrentThread.ApartmentState = ApartmentState.STA;?
      

  6.   

    提示信息已经很明显了,其他信息: 因为当前线程不在单线程单元中,故无法实例化 ActiveX 控件“c88f4186-3315-49f7-a457-668ac723042d”。这个COM组件需要STA单元,而所在上下文不能提供
    思归的两个方法都应该可行
      

  7.   

    我也试了思归的那个方法,但还是不行.也不知是不是我这条语句加得地方不对?麻烦两位老大写个Demo试一试怎么样?你们说的这些方法都试过,但还是不行.
    我想从两个主面入手解决这个问题,一是看能不能让VB的控件编译成MTA模型,这个好像行不通.二是把SmartClient的载体IEExec.exe 得运行方法改为单线程,这个好像也没什么答案.比较郁闷.如果不用smartclient,系统可正常运行,但那我写得这个东东的发布将异常困难,要发布到将近一千台客户端上.如果以后再有什么小毛病修改的话,部署 到这么客户端简值是个噩梦.请两位老大麻烦一下,写个例子试试,帮小弟一个忙.多谢!!
      

  8.   

    我还是把源码贴上来吧public class mainfun
    {
    public mainfun()
    {
    }
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main() 
    {
    Application.EnableVisualStyles();
    frmLogin frmLog=new frmLogin();
    Splash sp=new Splash (); if(frmLog.ShowDialog() ==System.Windows.Forms.DialogResult.OK)
    {
                                        //前面显示登录框.系统运行到这里出错.frmMain窗体里用到了一个VB开发的OCX
    frmMain frmmain=new frmMain();
    frmmain.My_opid=frmLog.M_opid; frmmain.userinfo=frmLog.userinfo; frmmain.isAutoChkinCCS=frmLog.isAutoChkinCCS ; frmmain.AgentInfo=frmLog.AgentInfo ; frmmain.UserType=frmLog.UserType; frmmain.taskPrx=frmLog.taskPrx;
    frmmain.staffs =frmLog.staffs;
    frmmain.AgentList = frmLog.AgentList ;
    Application.Run(frmmain); }
    else
    {
    frmLog.Close();
    frmLog.Dispose();
    } Application.Exit();
    System.Diagnostics .Process pross=System.Diagnostics.Process.GetProcessesByName  ("OneCall")[0];
    pross.Kill (); }
    }
      

  9.   

    so you triedstatic void Main() 
    {
                            Thread.CurrentThread.ApartmentState = ApartmentState.STA;
    Application.EnableVisualStyles();
    frmLogin frmLog=new frmLogin();
    Splash sp=new Splash ();and it didn't work?what if you do?static frmLogin frmLog;static void Main() 
    {
    Application.EnableVisualStyles();
    frmLog=new frmLogin();
    Splash sp=new Splash (); if(frmLog.ShowDialog() ==System.Windows.Forms.DialogResult.OK)
    {
    ThreadStart ts = new ThreadStart(RunThread);
    Thread t = new Thread(ts);
    t.ApartmentState = ApartmentState.STA;
    t.Start();
    }
    else
    {
    frmLog.Close();
    frmLog.Dispose();
    }
    }
    static void RunThread()
    {
    frmMain frmmain=new frmMain();
    frmmain.My_opid=frmLog.M_opid;
    frmmain.userinfo=frmLog.userinfo;
    frmmain.isAutoChkinCCS=frmLog.isAutoChkinCCS ;
    frmmain.AgentInfo=frmLog.AgentInfo ;
    frmmain.UserType=frmLog.UserType;
    frmmain.taskPrx=frmLog.taskPrx;
    frmmain.staffs =frmLog.staffs;
    frmmain.AgentList = frmLog.AgentList ;
    Application.Run(frmmain);
    }