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 等)

在 VB6 中通过 COM 处理在 .NET 类上公开的事件

WIA、Vista 和 VB6。这段代码有效吗?

在 C++ 中使用 COM 互操作对象