首页 新闻 会员 周边

COM组件注册 错误 没有注册类 Exception from HRESULT: 0x80040154

0
悬赏园豆:50 [已解决问题] 解决于 2015-04-23 16:11

COM组件是银联B2C的 开放接口组件

本地系统Win7 64,服务器是Server2008 64

本地无异常,在服务器上面组件注册也已成功

请教大神

门前有根大呲花的主页 门前有根大呲花 | 初学一级 | 园豆:149
提问于:2015-04-23 11:09
< >
分享
最佳答案
0

将 IIS 中对应的应用程序池修改为 32 位。

收获园豆:30
Launcher | 高人七级 |园豆:45045 | 2015-04-23 13:55

报错,验证试图MAC失败

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 14:01

@门前有根大呲花: 你是不是应用了群集策略?

Launcher | 园豆:45045 (高人七级) | 2015-04-23 14:04

@Launcher: 就一台服务器,没有部署群集

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 14:47

@门前有根大呲花: 通过 IIS,给你的网站指定一个固定的 MachineKey。

Launcher | 园豆:45045 (高人七级) | 2015-04-23 14:49

@Launcher: 我去研究一下,我这个问题的原因有可能是什么呢?是什么可能导致它出现这个问题的呢?

他在我本地就没有这个问题,现在搞不懂的就是不知道哪里出了问题

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 14:56

@门前有根大呲花: 不用研究吧,直接在 IIS 上设置下就行了。你把“验证试图MAC失败”后面的内容都给贴全了,我给你解释。

Launcher | 园豆:45045 (高人七级) | 2015-04-23 15:03

@Launcher: 我靠啊,怎么刚才用32就报错,看报错之后就改为flase了,现在改过来突然能用了又不报错了,这是什么原因?

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 15:10

@门前有根大呲花: 应用程序池重启后,MachineKey 变了,而客户端提交了一个使用旧的 MachineKey 加密的待验证东东。

Launcher | 园豆:45045 (高人七级) | 2015-04-23 15:14

@Launcher: 这个问题与这个启用32位应用程序有什么关系吗?为什么会有这个关系呢?

为什么在我本地不会报错呢 

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 15:14

@门前有根大呲花: 不要老说本地本地的,你就说调试,还是部署在 IIS 中,只要部署在 IIS 中,都可能遇到这个问题,因为 MachineKey 变动了,而页面保留了使用旧的 MachineKey 加密的东东。

Launcher | 园豆:45045 (高人七级) | 2015-04-23 15:16

@Launcher: MachineKey这个值如果没在web.config里面配置的话是什么东西自动创建的?

这个东西是每个网站都必有的东西吗?

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 15:17

@门前有根大呲花: 

MachineKey这个值如果没在web.config里面配置的话是什么东西自动创建的? ——〉由 .Net 运行时创建。

这个东西是每个网站都必有的东西吗? ——〉 是。

Launcher | 园豆:45045 (高人七级) | 2015-04-23 15:20

@Launcher: 下班了去自习研究一下这个machinekey,刚参加工作的不能都像我这么菜吧 那就没希望了

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 15:22

@Launcher: 这个问题与启用32位应用程序有什么关系呢 

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 15:25

@门前有根大呲花: 没有直接关系,而是修改设置后,应用程序重启,重新生成了一个新的 MachineKey。

Launcher | 园豆:45045 (高人七级) | 2015-04-23 15:28

@Launcher: 我说的是那个COM组件 没有注册类的问题与这个启用32位有什么关系呢

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 15:37

@门前有根大呲花: 因为你那个组件是 32 位的。

Launcher | 园豆:45045 (高人七级) | 2015-04-23 15:50

@Launcher: 那为什么我调试的时候不报错呢?那是不是发布的时候发布成x86的就没有错误了

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 15:57

@门前有根大呲花: 因为 VS 是 32 位的。你可以在发布的时候改成 x86 试试,但是 IIS 应用程序池中的选项可能会对它有影响,所以通常不特别指定,而是在 IIS 的应用程序池的选项中去修改。

Launcher | 园豆:45045 (高人七级) | 2015-04-23 16:01

@Launcher: 圆满了,剩下的就是我自己研究了,非常感谢,时间对每个人都是宝贵的非常感谢!

门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 16:07
其他回答(2)
0

建议将错误信息的文字粘贴出来

收获园豆:20
dudu | 园豆:30994 (高人七级) | 2015-04-23 11:39

试试这个方法:在项目属性里设置“生成”=>“目标平台”为x86而不是默认的ANY CPU

方法来自:VS2008在64位Windows平台上编译ArcEngine导致HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)错误的解决办法

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2015-04-23 11:45

@dudu: 用的是vs12发布的,里面没有这个x86的选项,另外服务器是64,还需要改变目标平台吗?

错误信息没有涉及到代码,上图最下面那几行代码就是调用DLL方法的代码,错误还是下面的错误

Retrieving the COM class factory for component with CLSID {522E44BF-7BC9-4135-B5EB-8CC154144B0D} failed due to the following error: 80040154 没有注册类 (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)). 

支持(0) 反对(0) 门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 12:44

@门前有根大呲花: 那就把“目标平台”改为x64试试

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2015-04-23 12:45

在博客园看的有的还说是需要重启IIS,我在本地调试时就是安装完组件之后就直接用的,本地VS调试的时候也用到IIS了吗?还是说每启用调试一次就启用一次IIS呢?还真是从没像这方面想过

支持(0) 反对(0) 门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 12:48

@门前有根大呲花: 调试的时候用的是IIS Express

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2015-04-23 12:50

@dudu: 那个活动解决方案平台里面只有一个Any CPU,自己键入的可以吗

支持(0) 反对(0) 门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 12:51

@门前有根大呲花: 或者试试将IIS应用程序池的帐户改为LocalService或LocalSystem或NetworkService

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2015-04-23 12:52

@dudu: 还是不可以

支持(0) 反对(0) 门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 13:05

@dudu: 这个错误与IIS还能有什么关系吗?

支持(0) 反对(0) 门前有根大呲花 | 园豆:149 (初学一级) | 2015-04-23 13:06
0

注意检查一下编译的调试和调试符号相关选项。不同于托管程序集,非托管dll的调试符号必须与dll完全一致。比如:你可以部署一个release版本的托管程序集同时还附带调试符号,也可以是一个debug版本缺失调试符号文件,甚至调试符号文件和程序集版本不一致都不会报错;但是部署非托管程序时,必须是完全一致,debug版本的dll必须附带同一编译版本的调试符号。如果是混合编译的,那编译选项的不同在调试符号的附带部署上又还会有细微差别(强制一致的要求范围可能扩散到引用的托管程序集)。

阿毅 | 园豆:242 (菜鸟二级) | 2015-04-25 12:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册