Vista 中的 VB6 .NET 互操作问题
Posted
技术标签:
【中文标题】Vista 中的 VB6 .NET 互操作问题【英文标题】:VB6 .NET interop issue in Vista 【发布时间】:2009-06-05 09:31:19 【问题描述】:我用 C# 编写了一个程序集,我需要从 VB6.0 应用程序调用 DLL 上的一个方法。
我使 DLL COM 兼容并相应地注册了 DLL。然后,我将在我的 VB 应用程序中使用 VB6.0 CreateObject
方法在 .NET 程序集中实例化该类。
Set dotNetObj = CreateObject("Namespace.ClassName")
然后我就可以调用该类的任何方法。
问题:
一切正常,直到我尝试在 Vista 机器上执行代码。每当我执行 exe 时,它都可以正常工作,但是每当使用“以管理员身份运行”选项执行 exe 时,都会出现以下错误:
"ActiveX 组件无法创建 对象。”
我需要这个 EXE 以管理员模式运行,否则旧系统的某些区域将无法工作。
关于为什么CreateObject
不能在管理员模式下工作的任何想法?
【问题讨论】:
我只需要在我的包和部署软件中将 InstallAllUsers 属性切换为 TRUE。 【参考方案1】:听起来 COM 组件可能只为 用户 注册 - 所以当管理员尝试它时,clsid 是未知的。尝试为管理员运行安装/注册过程。
(vista 是把 clsid 放在 HKCU 里吗?还是只放在 HKLM 里?)
快速搜索似乎表明它与 UAC 是启用还是禁用有关...启用它会在 HKCU 中查找...禁用并在 HKLM 中查找。因此,如果您要安装到 HKCU,则禁用 UAC 的管理员将无法使用它。
【讨论】:
我只需要在我的包和部署软件中将 InstallAllUsers 属性切换为 TRUE。【参考方案2】:因为它只在用户空间注册?
尝试在管理 shell 中注册您的 dll
regasm mycomponent.dll /register /codebase /tlb
【讨论】:
即使它符合 COM 标准?你可能是对的,我会检查一下以上是关于Vista 中的 VB6 .NET 互操作问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在vb6中注册一个不能用作com互操作的.net DLL?
LLVM 互操作性(如 JVM 或 .Net)- 有可能吗?
COM 互操作 (CCW) 中的重载 - IDispatch 名称包括后缀(_2、_3 等)