3

我有一个使用 C++ COM 对象的 C# 应用程序,它们都构建在 32 位机器上。现在我必须在 64 位机器上运行它们。我注册了 COM 对象。在 computer\hkey_classes_root\wow6432node\clsid{xxx} 下的寄存器中创建了相应的条目。但是,当我尝试运行应用程序时,它说 |“检索具有 CLSID {xxx} 的组件的 COM 类工厂失败,原因是以下错误:80040154。”。据我了解,错误代码表示该类未注册。请帮忙!!!谢谢

4

4 回答 4

4

上面的第一个答案是正确答案。如果引用 32 位 COM 组件,则不能在 64 位 Windows 上运行 CPU ANY 目标应用程序。它不会加载。

正在发生的事情是 JIT 看到 CPU ANY 并将您的应用程序提升到 64 位。但是没有 64 位版本的 com 控件,因此您会收到未注册的错误。

对于使用 Microsoft Access 作为数据库的人来说,这是一个大问题。没有 64 位版本的 Access,所以当他们看到错误时,他们认为他们需要 64 位运行时(不存在)。您必须仅将您的应用程序标记为 32 位才能使用 Access 运行时。

这是一个糟糕的选择(恕我直言) - 找到具有 64 位版本的更好组件,或者使用 100% 托管代码。

我不喜欢将每个应用程序都标记为 32 位,除非他们真的需要它。

于 2009-06-09T20:59:45.490 回答
2

C# 应用程序可能已使用 Any CPU 目标进行编译,它将在 x64 机器上以 64 位模式运行。64 位进程无法访问 32 位进程。

在 Visual Studio 中,您可以强制它编译为仅限 32 位的应用程序。它位于项目属性、构建选项卡、平台目标下拉列表中。将其设置为x86

可能还有其他方法可以强制它作为 32 位应用程序运行,但我不熟悉它们。

于 2009-06-09T20:39:59.323 回答
2

.NET 运行时自动将应用程序作为 64 位运行,它不再可以将 32 位 COM 组件加载到其进程中。

如果 COM 组件具有自动化兼容的接口,这很容易解决。创建一个 COM+ 应用程序(控制面板->管理工具->组件服务)并将组件添加到其中。这样,您将强制在单独的进程中创建组件,并且您将不再关心您的客户端应用程序作为 64 位应用程序运行。

于 2009-06-10T06:32:20.543 回答
0

我认为您不能在 64 位机器上本地运行 32 位应用程序。您需要将您的应用程序编译为 64 位二进制文​​件或在模拟器下运行它(如 Windows 上的 WOW64)。如果您的应用程序(内置 64 位二进制文​​件)使用任何外部 dll,您还需要所有这些 dll 的 64 位版本。

这是一个很好的参考:

http://searchwindowsserver.techtarget.com/tip/0,289483,sid68_gci1220022,00.html

编辑:

如果您转到项目的属性 -> 构建,将平台的目标从“任何 CPU”更改为 X86。看看这是否有帮助。

或者您需要注册您的 dll:http ://riteshk.blogspot.com/2007/05/retrieving-com-class-factory-failed-due.html

于 2009-06-09T20:48:13.940 回答