C# 如何解决未注册的COM异常类(来自HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))?

C# 如何解决未注册的COM异常类(来自HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))?,c#,vb.net,C#,Vb.net,当我尝试创建COM类的实例时,它会抛出一个异常,如下所示 未注册的类(来自HRESULT:0x80040154(REGDB_E_CLASSNOTREG)的异常) 请建议如何解决此问题?通过注册类(特别是其CLSID)--请参阅例如 您试图初始化的任何程序或进程都可能未安装在您的计算机上、安装已损坏或需要注册 安装、修复(通过添加/删除程序)或注册(通过Regsvr32.exe) 您没有提供足够的信息,我们无法为您提供更多帮助。还请注意,初始化时的类上下文可能会创建该异常。如果您有一个编码为INP

当我尝试创建COM类的实例时,它会抛出一个异常,如下所示

未注册的类(来自HRESULT:0x80040154(REGDB_E_CLASSNOTREG)的异常)


请建议如何解决此问题?

通过注册类(特别是其CLSID)--请参阅例如

您试图初始化的任何程序或进程都可能未安装在您的计算机上、安装已损坏或需要注册

安装、修复(通过添加/删除程序)或注册(通过Regsvr32.exe)


您没有提供足够的信息,我们无法为您提供更多帮助。

还请注意,初始化时的类上下文可能会创建该异常。如果您有一个编码为INPROC_SERVER的对象,但您尝试将实例作为CLSCTX_LOCAL_SERVER共同创建,您也会得到该错误


您需要确保对象已注册,并且CoCreateInstance正在使用正确的类上下文创建实例。

您需要确保所有程序集都是为正确的体系结构编译的。如果重新安装COM组件不起作用,请尝试更改x86的体系结构。

如果在IIS上的web应用程序中使用64位COM组件,请确保应用程序池设置为不允许32位应用程序(在高级设置中启用32位应用程序:false)

我的问题和解决方案

我有一个32位的第三方dll,我已经安装在2008 R2机器上,它是64位的

我有一个在.NET4.5框架中创建的wcf服务,它为进程调用32位第三方dll。现在,我将build属性设置为目标“any”cpu,并将其部署到64位机器上

当我试图调用wcf服务时,出现错误“80040154类未注册(来自HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG)”

现在,我使用ProcMon.exe跟踪com注册表问题,并确定进程正在查找HKLM\CLSID和HKCR\CLSID上没有注册表项的注册表项

了解到Microsoft不会将32位com组件注册到64位计算机中的路径HKLM\CLSID、HKCR\CLSID,而是将条目放置在HKLM\Wow6432Node\CLSID和HKCR\Wow6432Node\CLSID路径中

现在冲突是64位进程试图调用64位计算机中的32位进程,该进程将在HKLM\CLSID、HKCR\CLSID中查找注册表项。解决方案是我们必须强制64位进程在HKLM\Wow6432Node\CLSID和HKCR\Wow6432Node\CLSID中查找注册表项

这可以通过将wcf服务项目属性配置为目标为“X86”计算机而不是“Any”来实现

将“X86”版本部署到2008 R2服务器后,出现问题“System.BadImageFormatException:无法加载文件或程序集”


此badimageformatexception的解决方案是在右侧应用程序池的IIS应用程序池属性中将“Enable32bitApplications”设置为“True”。

我通过在应用程序池高级设置中启用32位应用程序使其工作。右键单击应用程序池,然后选择高级设置-启用32位应用程序。
这可能对其他人有所帮助。

对我来说,我必须创建64位构建配置。

在我的情况下

我的平台是x64

Dll库(sdk)
可再发行包
是x64

所以

  • 在解决方案资源管理器中,导航到您的项目

  • 打开
    Properties

  • 将平台目标从AnyCPU更改为x64


  • 在这里找到解决方案,运行mmc-32工具(而不是dcomcfg)

    在具有32位Office的64位系统上,请尝试以下操作:

    Start
    Run
    mmc -32
    File
    Add Remove Snap-in
    Component Services
    Add
    OK
    Console Root
    Component Services
    Computers
    My Computer
    DCOM Config
    Microsoft Excel Application
    

    我解决这个问题的方法是通过
    regsvr32
    注册
    COM

    确保正在调用的COM已注册


    我的应用程序使用了xCEDeCay.dll >代码>,我没有注册它。注册后,应用程序工作得很好。

    我通过COM进入C++客户端调用.NET程序集。结果发现,无法找到.NET组件依赖的程序集之一。第一个程序集有什么问题,但实际上它是第一个程序集的依赖之一。在从C++客户端调用COCURATIN()时,我收到了两个不同的错误。 REGDB_E_CLASSNOTREG类未注册 第二次尝试是: 0x8013100:定位的程序集的清单定义与程序集引用不匹配

    因此,请检查程序集的引用是否存在。
    我通过使用dotPeek浏览第一个程序集发现了这一点,并注意到其中一个引用丢失。将正确版本的依赖项放在文件夹中解决了这两个错误。

    我正在编译我的应用程序,目标是任何CPU,主要问题是adobe reader安装在较旧的v10.x需要升级v11.x,这就是解决此问题的方法。

    我的解决方案是在IIS中相对应用程序池的高级设置中将“启用32位应用程序”更改为True


    我在运行时使用COM类遇到了相同的问题,即“类未注册异常”。对于我来说,我可以通过转到app.config文件并将“startup”和“supportedRuntime”元素更改为类似以下内容来解决此问题:

    <configuration>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
      </startup>
    </configuration>
    
    
    
    你可以在这里阅读更多的细节

    这里呢

    我应该注意,我正在运行Visual Studio 2017。 目标cpu=x86
    Embed Interop Type=true(在属性窗口中)

    在我的例子中,该类已正确注册,并在任何CPU/64位模式下构建

    但是