jon*_*ers 18 .net c# activex winforms
我们需要使用第三方ActiveX控件.
唯一的问题是,我们软件中的图层是业务层,无法访问窗口或表单.它还运行在不是STA的单独线程上(并且应该在任何线程中工作).
我们使用此解决方法使其工作,而不是将UI与业务逻辑分开.
Thread thread = new Thread((ThreadStart)
delegate
{
_myActiveX = new MyActiveXType();
_myActiveX.CreateControl();
//more initialize work
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Run Code Online (Sandbox Code Playgroud)
然后,只要我们需要引用控件,我们调用_myActiveX.BeginInvoke()
或Invoke()
.
在处理这个类(退出我们的应用程序)时,我们处理控件并中止线程.
我的问题是,这有什么问题吗?有没有更好的方法来处理这个?
在未知的多线程环境中有没有更好的内置方法来使用ActiveX控件?我们试图以包装控件的方式编写我们的类,但是可以在任何线程中工作.
更新:作为一个答案建议,我们真的宁愿使用标准COM对象,而根本不使用控件.我们的问题是我们会在我们调用COM对象的第一个方法或属性上得到错误"(来自HRESULT的异常:0x8000FFFF(E_UNEXPECTED)".这是一个非常一般的错误,我们在使用ActiveX时没有得到这个错误, 有任何想法吗?
更新:我们的ocx是"CX25.ocx",使用tlbimp.exe我们得到CX25Lib.dll.使用aximp.exe,我们得到AxCX25Lib.dll和CX25Lib.dll.在任何一种情况下CX25Lib.dll都不起作用.AxCX25Lib.dll可以使用.
jon*_*ers 16
我认为这是解决这个问题的正确方法.
过去几周我们一直在测试环境中使用我的代码而没有任何问题.
如果有人必须使用没有表单的ActiveX,我认为这是一种方法.
只需确保在ActiveX对象的构造函数后直接调用_yourActiveXControl.CreateControl().这简化了我们最初的许多问题.