我很难从ActiveX DLL (从VB6编译)在C# WinForms应用程序的后台线程中运行一个函数。
由于VB6 DLL项目包含了许多对名为Sheridan (seled32.ocx)的旧库的引用,我被告知“不支持多线程模式”,因此在VB6中编译DLL时,必须将线程模型选项设置为单线程(而不是单元线程)。因此,即使我在调用DLL的C#线程对象上将C#属性设置为STA,它仍然会阻塞UI线程。
我不知道现在我的选择是什么。从DLL中重构Sheridan控件将是一项乏味的工作。另一种方法是接受失败,让UI在DLL完成工作时挂起。
我想我的主要问题是:有没有人知道我可以(没有太多麻烦)在一个单独的进程/服务中运行单线程ActiveX DLL,这个进程/服务可以从主C#线程异步调用?或者还有其他我不知道的选择?
解决了:基于用户@mnistic的信息,我找到了一个解决方案。我不得不将ActiveX DLL重新构建为ActiveX EXE,它作为进程外组件运行.为了使它正常工作,我必须在项目属性中将“启动模式”设置为“独立”。我还将VB6类上的Instancing参数设置为SingleUse,以确保全局状态不会在实例之间共享。
在更新项目引用之后,我能够从我的C#应用程序中在后台线程中调用库中的函数,而不会导致GUI滞后。
发布于 2017-11-14 14:40:02
谈到ActiveX,微软区分了进程内组件和进程外组件.有时,当人们谈论ActiveX时,他们指的是与使用它们的客户端在同一个进程中运行的进程内组件、dll或ocx文件。通常,这些组件包括VB6使其易于嵌入到客户端应用程序中的GUI元素。但是,进程内组件必须使用客户端的执行线程,在您的情况下,这会导致主线程中的锁定。
这就是程序外组件的用途。它们在一个单独的线程中执行--事实上是独立的进程。缺点是通信需要跨越进程边界,但在您的情况下,这不是一个问题,而且它们相对容易设置:https://msdn.microsoft.com/en-us/library/aa262334%28v=vs.60%29.aspx
https://stackoverflow.com/questions/47264054
复制相似问题