我有一个使用C ++ COM对象的C#应用程序都在32位机器上构建。现在我必须在64位机器上运行它们。我注册了COM对象。在computer \ hkey_classes_root \ wow6432node \ clsid {xxx}下的寄存器中创建了相应的条目。 但是,当我尝试运行应用程序时,它说|“由于以下错误,检索具有CLSID {xxx}的组件的COM类工厂失败:80040154”。据我了解,错误代码表示该类未注册。 请帮忙!!! 感谢
答案 0 :(得分:4)
上面的第一个答案是正确答案。如果引用32位COM组件,则无法在64位Windows上运行CPU ANY目标应用程序。它不会加载。
发生的事情是JIT看到CPU ANY并将你的应用程序推广到64位。但是没有64位版本的com控件,因此你得到了未注册的错误。
对于将Microsoft Access用于其数据库的用户来说,这是一个很大的问题。没有64位版本的Access,所以当他们看到错误时,他们认为他们需要64位运行时(不存在)。您必须将应用程序标记为32位才能使用Access运行时。
这是一个糟糕的选择(恕我直言) - 找到一个更好的64位版本的组件,或100%托管代码。
我不喜欢每个标记应用程序仅为32位,除非他们真的需要它。
答案 1 :(得分:2)
C#app可能已使用Any CPU目标进行编译,该目标将在x64计算机上以64位模式运行。 64位进程无法访问32位进程。
在Visual Studio中,您可以强制它作为32位应用程序进行编译。它位于项目属性,构建选项卡,平台目标下拉列表中。将其设置为x86
。
可能有其他方法强制它作为32位应用程序运行,但我不熟悉它们。
答案 2 :(得分:2)
.NET运行时自动以64位运行应用程序,它不再能将32位COM组件加载到其进程中。
如果COM组件具有自动化兼容接口,则很容易解决。创建COM +应用程序(控制面板 - >管理工具 - >组件服务)并将组件添加到其中。这样,您将在单独的进程中强制创建组件,并且您将不再关心客户端应用程序是否作为64位应用程序运行。
答案 3 :(得分: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