代码之家  ›  专栏  ›  技术社区  ›  Jaswant Agarwal

如何解决未注册的COM异常类(来自hresult的异常:0x80040154(regdb_e_classnotreg))?

  •  73
  • Jaswant Agarwal  · 技术社区  · 16 年前

    当我试图创建一个COM类的实例时,它抛出一个异常

    类未注册(hresult的异常:0x80040154(regdb_e_classnotreg))。

    请建议我如何解决?

    19 回复  |  直到 7 年前
        1
  •  38
  •   nawfal Donny V.    12 年前

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

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

    你没有提供足够的信息给我们帮助你。

        2
  •  54
  •   Matt Fenwick sagarcool89    14 年前

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

        3
  •  11
  •   Waheed    10 年前

    我的问题和解决方法

    我有一个32位的第三方DLL,它安装在2008年的64位R2机器上。

    我有一个在.NET 4.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\ww6432node\clsid和hkcr\w6432node\clsid路径中。

    现在冲突是64位进程试图在64位计算机中调用32位进程,该进程将在hklm\clsid、hkcr\clsid中查找注册表项。解决方案是我们必须强制64位进程查看位于hklm\wow6432node\clsid和hkr\wow6432node\clsid的注册表项。

    这可以通过将WCF服务项目属性配置为目标为“x86”计算机而不是“any”来实现。

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

    此BadImageFormatException的解决方案是在右AppPool的IIS AppPool属性中将“Enable32BitApplications”设置为“true”。

        4
  •  9
  •   Andrew Keith    16 年前

    还要注意,初始化时类上下文可以创建该异常。如果有一个对象被编码为inproc_server,但是您试图将其共同创建为clsctx_local_server,那么您也会得到这个错误。

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

        5
  •  9
  •   Matsen75    12 年前

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

        6
  •  4
  •   Yoky    10 年前

    我通过在应用程序池高级设置中启用32位应用程序使其正常工作。右键单击应用程序池并选择高级设置-启用32位应用程序。 这可能会帮助那里的人。

        7
  •  3
  •   Alex Martelli    16 年前

    通过注册类(特别是它的clsid)——参见 here .

        8
  •  2
  •   Basheer AL-MOMANI    10 年前

    以我为例

    my platform 是X64

    the Dll library(sdk) 以及 redistributable package 是X64

    所以

    1. 在解决方案资源管理器中 navigate to your project

    2. 打开 Properties

    3. change the Platform target from AnyCPU to x64

    enter image description here

        9
  •  2
  •   Athena Vinod R    10 年前

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

    确保您正在调用的COM已注册。

    我的应用程序正在使用 xceedcry.dll 我没有登记。我一注册,申请就很顺利。

        10
  •  1
  •   Judy007    10 年前

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

        11
  •  0
  •   Sean B    9 年前

    我通过COM从C++客户端调用这个.NET程序集。结果是找不到.NET程序集所依赖的程序集之一。我挣扎了一段时间,想弄清楚第一个组件出了什么问题,但它实际上是第一个组件的依赖项之一。在从C++客户端调用COCCREATIN()时,我收到了两个不同的错误。第一个是: 未注册regdb_e_ClassNotReg类 第二次尝试是: 0x80131040:找到的程序集的清单定义与程序集引用不匹配。

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

        12
  •  0
  •   Anjan Kant    9 年前

    我正在编译我的应用程序目标 任何CPU 主要问题是,Adobe Reader的安装时间较旧 V10 x 需要 升级 V1.x 这就是我解决这个问题的方法。

        13
  •  0
  •   Adrian    9 年前

    我的解决方案是改变 启用32位应用程序 “在IIS中相对应用程序池的高级设置中为true。

    App Pool

    Enable 32 bits applications

        14
  •  0
  •   Joseph Mawer    9 年前

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

    <configuration>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0"/>
      </startup>
    </configuration>
    

    你可以在这里了解更多的细节 http://stackoverflow.com/questions/1604663/

    这里 https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx

    我应该注意到我正在运行Visual Studio 2017。 目标CPU=x86 嵌入interop type=true(在“属性”窗口中)

        15
  •  0
  •   Bhupinderjit Dhanoa    8 年前

    在我的例子中,这个类是正确注册并内置的 任何CPU/64位 模式。

    但是 启用32位应用程序 性质 IIS应用程序池 使用类的应用程序的设置为 .

    由于应用程序池配置与实际注册的类之间的体系结构不匹配,找不到类。

    设置 启用32位应用程序 解决了问题。 IIS App Pool Settings

        16
  •  0
  •   Deydra A    8 年前

    我使用MapWingis也有同样的问题。 我在Visual Studio 2015 Windows窗体项目上找到了解决方案,只需右键单击项目->属性->生成,将配置设置为所有配置,并在ConboBox“平台目标”中将其设置为x64。

        17
  •  0
  •   Muhammad Saeed    8 年前

    转到.NET Framework目录并用注册它们各自的dll ReVSR32.EXE 空白dll路径。

        18
  •  0
  •   Eray Balkanli    7 年前

    我也面临同样的问题。在做了一些研究之后,我找到了适合我的修复方法,它可能会有用。从我的观察来看,这个问题不仅与重新安装有关,还取决于访问权限。

    步骤1:修复特定的COM对象。

    步骤2:组件服务>计算机>我的计算机>DCOM配置>选择您的COM对象>右键单击属性>安全选项卡>访问权限>选择自定义>单击编辑>选择IIS用户(如果不存在,请使用完整权限创建)并授予完全访问权限,然后单击确定。

    转到“标识”选项卡>您可以选择“交互式用户”或“此用户”>单击“应用”并确定。如果您选择“此用户”,我们必须将管理特权用户授予该服务器

    步骤3:打开IIS管理器>重新启动应用程序池。

    注意:如果需要,请重新启动服务器

        19
  •  -1
  •   LarsTech    10 年前

    在这里找到解决方案,运行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
    

    enter image description here