线上一个项目使用了到jacob调用dll文件,由于最近客户迁移到了私有云环境中,服务器的操作系统从32位的换成了64位的,使用RegAsm注册的时候,提示说不是有效的win程序,就想到了是因为操作系统的位数换了,所以从新在新版的vs上面重新生成了下dll文件,在注册就ok了。
没想到过了一段时间后,客户反应项目的某个功能不能正常使用了,经过查看日志发现是java在通过jacob调用dll文件的时候,提示com.jacob.com.ComFailException: Can't co-create object,当时就郁闷啊,这明明迁移过来的时候好好的,跟其他同事确认了下,他们最近也没有去改变服务器的环境啥的。然后我尝试着吧dll卸载了重新注册,再试还是一样的错误。百度了下,比较多的是2中情况:
1.确认“DCom Server Process Launcher”这个服务选项默认是运行的。
2.确认在java代码中,通过jacob调用的ProgId和你注册的dll的ProgId是一致的
通过检查,发现不符合上面的情况,后来有尝试着用管理员权限的cmd来注册dll,调用还是一样的错误,在windos/system32下面注册又报错,大意是无法调用依赖啥的,于是想着配置RegAsm的环境变量试试,进入到对应的目录后,我猛然发现,注册也分32和64位的。。。
我一直进入的是默认的Framework目录下面的v4版本的RegAsm,于是换成64位的注册,再试项目功能正常了。后来想了下,有可能是因为服务器开启了update,导致服务器的环境发生了变化。
附带RegAsm的常用命令:
RegAsm /u dllFileName 卸载注册的dll
RegAsm dllFileName /tlb:tlbFileName 注册dll文件