C# 如何解决未注册的COM异常类(来自HRESULT的异常:0x80040154(REGDB_E_CLASSNOTREG))?
当我尝试创建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
请建议如何解决此问题?通过注册类(特别是其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位模式下构建
但是