(100分)我写了一个WinForm,里面嵌了一个VB写得OCX控件,在当作smartclient运行时出现线程错误.各位高手来看看

kfzdp 2005-08-02 12:23:07
我写了一个 WinForm,里面用到了一个VB写得OCX控件。OCX的线程模型是“单元线程”。运行正常
我把这个WinForm应用当成SmartClient部署到了IIS(5.0,6.0都测试过)的虚拟目录中,在客户端访问后出现以下错误提示:

未处理的“System.Threading.ThreadStateException”类型的异常出现在 system.windows.forms.dll 中。

其他信息: 因为当前线程不在单线程单元中,故无法实例化 ActiveX 控件“c88f4186-3315-49f7-a457-668ac723042d”。

请问各位大侠这个问题怎么解决?急昐。

多谢各位大侠。
...全文
375 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
linfengcyl 2005-10-22
  • 打赏
  • 举报
回复
mark
kfzdp 2005-08-03
  • 打赏
  • 举报
回复
多谢思归。照你的方法已经解决了问题。

再次感谢。
zhilunchen 2005-08-02
  • 打赏
  • 举报
回复
顶!
saucer 2005-08-02
  • 打赏
  • 举报
回复
what is your client code? do you have

[STAThread]

in your application like Main method?

[STAThread]
static void Main()
{
//....
}
kfzdp 2005-08-02
  • 打赏
  • 举报
回复
顶一下.
kfzdp 2005-08-02
  • 打赏
  • 举报
回复
不用设置啊.
你看一下有关SmartClient的东东.

在IIS上设置一个虚拟目录,把Windows托管应用部署到此虚拟目录中.通过Url方式访问后,IE不会提示下载该exe(前提是你要装 .net framework而且没有其它的下载工具),而是把此exe运行在一个IEExec.exe的进程里.
saucer 2005-08-02
  • 打赏
  • 举报
回复
so you tried

static 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);
}
saucer 2005-08-02
  • 打赏
  • 举报
回复
你是怎么设置的?如果

http://hostname/appname.exe

的话,这程序是下载在客户端运行么还是在服务器端运行?
kfzdp 2005-08-02
  • 打赏
  • 举报
回复
再顶一下。
kfzdp 2005-08-02
  • 打赏
  • 举报
回复
for 思归:

有Attribute [STAThread].如果把这个Attribute改为[MTAThread]则在本地都运行不了,异常跟上边那个一样.如果改为[STAThread]则在本地运行正常,只是部署到IIS后,客户端通过http://hostname/appname.exe访问时会出现上面的异常.
cdo 2005-08-02
  • 打赏
  • 举报
回复
没遇到过,帮你顶一下.
zeusvenus 2005-08-02
  • 打赏
  • 举报
回复
是不是应用程序的主入口有问题?
kfzdp 2005-08-02
  • 打赏
  • 举报
回复
我还是把源码贴上来吧

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 ();

}
}
kfzdp 2005-08-02
  • 打赏
  • 举报
回复
我也试了思归的那个方法,但还是不行.

也不知是不是我这条语句加得地方不对?

麻烦两位老大写个Demo试一试怎么样?

你们说的这些方法都试过,但还是不行.
我想从两个主面入手解决这个问题,一是看能不能让VB的控件编译成MTA模型,这个好像行不通.二是把SmartClient的载体IEExec.exe 得运行方法改为单线程,这个好像也没什么答案.

比较郁闷.如果不用smartclient,系统可正常运行,但那我写得这个东东的发布将异常困难,要发布到将近一千台客户端上.如果以后再有什么小毛病修改的话,部署 到这么客户端简值是个噩梦.

请两位老大麻烦一下,写个例子试试,帮小弟一个忙.

多谢!!
速马 2005-08-02
  • 打赏
  • 举报
回复
提示信息已经很明显了,其他信息: 因为当前线程不在单线程单元中,故无法实例化 ActiveX 控件“c88f4186-3315-49f7-a457-668ac723042d”。

这个COM组件需要STA单元,而所在上下文不能提供
思归的两个方法都应该可行
saucer 2005-08-02
  • 打赏
  • 举报
回复
have you tried to add this code,

Thread.CurrentThread.ApartmentState = ApartmentState.STA;

?

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧