.net - 老化的 32 位 OCX 控件无法在 .NET 中加载

标签 .net visual-studio-2010 com 64-bit ocx

我正在开发一个 .NET 应用程序,该应用程序依赖于老化的 OCX 控件。该控件提供允许用户与航空公司预订系统交互的终端界面。它已经在多个 VB6 应用程序中“成功”使用,但今后我们需要/希望在 .NET 应用程序中使用它。

因此,在使用 .NET 4 和 Visual Studio 2010 的 Windows XP (x86) 机器上,我创建了 Winforms 和 WPF 应用程序,它们使用已正确注册的控件。我已经实现了 Reg Free COM 并使用 XCOPY 和 Click-Once,这两个项目都可以成功部署到 Windows XP (x86) 计算机,并且都可以按预期工作,而无需注册控件。不幸的是,对于 Vista (x86) 和 Windows 7 (x64) 上的部署来说,情况并非如此,应用程序会启动,但不会呈现任何控件。

为了理解该问题,我尝试在 Windows 7 (x64) 开发环境上注册该控件。我都尝试过:

  • 使用普通 regsvr32(x64 注册表)注册控件
  • 使用 SysWOW64 版本的 regsvr32(x86 注册表)注册放置在 SysWOW64 目录中的控件

在这两种情况下,控件似乎都已成功注册,并且在全新的 Winforms 项目中,我可以将控件添加到工具箱(出现图标等)。然而,一旦我将控件拖到窗体上,它就会在窗体一角显示为一个小框(而不是 XP 上看到的终端窗口),甚至 Interop 文件的生成方式也与 XP 相同?!

XP 中的控件

Control in XP

选中时在 Windows 7 中看到的控件

Control in Windows 7

我花了很长时间在网上寻找任何类型的解决方案或类似问题,但无济于事。欢迎任何建议!

更新1:

正如 @DanielHilgarth 所建议的,我使用该控件在 VB6 中创建了一个基本应用程序,并在 Windows 7 (x64) 上运行它,令人烦恼的是,它会拾取注册的 COM 组件并按预期工作,即使 .NET 应用程序或项目可以并排运行并且看不到任何控制!?

更新2

如果我使用该控件在我的 XP 机器上创建一个基本的 Winforms 应用程序(但要求该控件注册,即不是免费注册)。当它在我的 Windows 7 (x64) 计算机上运行时,如果未注册控件,将无法启动(如预期)。对于应用程序来说,控件是否在 x86/x64 注册表中注册似乎并不重要,无论它启动但看不到控件!?

更新3

我注意到,如果我在 Windows 7 环境上运行 Winforms 项目(在 XP 中创建且无需 COM 注册),则表单设计器将失败,除非再次注册的控件(按预期)似乎并不关心哪个注册表该组件已注册。注册后,将看到表单设计器(无控制),并且在构建时会看到以下警告:

Windows 7 warnings

研究此警告是徒劳的,它似乎表明 Visual Studio 正在查找错误的注册表路径,但我找不到解决此问题的方法?

最佳答案

我认为我无法回答您的问题,但也许我可以为您提供一些故障排除的想法。

我只是猜测,但问题的根源可能是 64 位 Windows 上的 32 位注册问题,或者可能是权限问题,因为您正在使用 UAC 运行。要解决最后一部分的问题,您可以关闭 UAC,看看是否有帮助。

64 位 Windows 上的 32 位 COM

我感觉 32 位和 64 位有些困惑。 64 位 Windwos 上只有一个注册表。然而,COM 组件要么是 32 位,要么是 64 位。这意味着 64 位注册表中需要有单独的区域用于 32 位注册,因此同一注册可以有两种不同的实现(Wow6432Node)。

现在重要的是,32 位进程将在不知情的情况下看到注册表的修改版本。当 COM 组件注册 CLSID 时,它使用路径 HKCR\CLSID 而不知道它已映射到 HKCR\Wow6432Node\CLSID。另一方面,如果您想使用 64 位 Regedit 检查 32 位注册,您需要查看那里。但是,使用 %systemroot%\syswow64\regedit.exe 中的 32 位 Regedit 在 64 位上解决 32 位注册问题通常更容易,您可以在其中看到注册表,就像 32 位进程看到的一样。

您要使用的控件是 native 32 位控件,不会在 64 位进程中加载​​或运行。您写道您正在“使用普通的 regsvr32(x64 注册表)注册控件”,但这是不可能的。您应该确保从 32 位角度来看,控件及其所有依赖项都已正确注册。如果您从 64 位角度查看注册,则需要完全了解 Windows 如何重新映射 32 位注册表(或者只是切换到 32 位 Regedit)。

您显然想使用免注册 COM,但在尝试之前,您也许应该尝试看看是否可以使用“老派”注册来解决您的问题。

免注册COM

我建议您阅读文章 Registration-Free Activation of COM Components: A Walkthrough 中的疑难解答部分。 :

When troubleshooting registration-free COM issues, the Event Viewer [...] is your friend

关于.net - 老化的 32 位 OCX 控件无法在 .NET 中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9601196/

相关文章:

excel - Delphi - 更改 Excel 中的图表标题会导致 AV - 使用完整示例进行更新

com - 什么是 "automation-compatible language"?

c# - 如果我不知道旧密码,如何更改密码?

c# - 我如何在项目中引用 "added as link"时的 dll?

.net - web.config 转换为 <applicationSettings>

c# - 为什么我不需要引用 "System.dll"来使用 "System"命名空间?

c++ - MSCV 2010 --someNumber 运算符的不正确行为

c# - COM 接口(interface)声明

.net - 为什么 Entity Framework 试图插入 NULL?

.net - "Check on node text click"用于 WinFormTreeView