Run*_*odt 5 c# vb6 dll multithreading activex
我正在努力从一个来自C#WinForms应用程序的后台线程中的ActiveX DLL(从VB6编译)运行一个函数.
因为VB6 DLL项目包含很多对称为Sheridan Controls(threed32.ocx)的旧库的引用,我很有帮助地通知它"不支持多线程模式",所以我必须将Threading Model选项设置为Single Threaded (而不是Apartment Threaded)在VB6中编译DLL时.因此,即使我在我调用DLL的C#Thread对象上将ApartmentState属性设置为STA,它仍然会阻塞UI线程.
我不确定我的选择是什么.从DLL重构Sheridan控件将是一项繁琐的工作.另一个是接受失败,让DLL在DLL工作时挂起.
我猜我的主要问题是; 有没有人知道我可以(没有太多麻烦)在单独的进程/服务中运行单线程ActiveX DLL,可以从主C#线程异步调用?或者还有其他我不知道的选择吗?
解决:根据用户@mnistic的信息,我找到了解决方案.我不得不将ActiveX DLL重建为ActiveX EXE,它作为进程外组件运行.为了使它工作,我不得不在项目属性中将"Start Mode"设置为"Standalone".我还将VB6类的Instancing参数设置为SingleUse,以确保不跨实例共享全局状态.
更新项目引用后,我能够在C#应用程序的后台线程中调用库中的函数,而不会导致GUI延迟.
当谈到 ActiveX 时,Microsoft 区分了进程内组件和进程外组件。有时,当人们谈论 ActiveX 时,他们指的是进程内组件、dll 或 ocx 文件,它们与使用它们的客户端在同一进程中运行。通常,这些组件包括 VB6 使之易于嵌入客户端应用程序的 GUI 元素。但是,进程内组件必须使用客户端的执行线程,在您的情况下,这会导致主线程中的感知锁定。
这就是进程外组件的用途。它们在单独的线程中执行——事实上是单独的进程。缺点是通信需要跨越进程边界,但在您的情况下,这不是问题,而且它们相对容易设置:https ://msdn.microsoft.com/en-us/library/aa262334%28v=对比 60%29.aspx