开启左侧

HDevEngine不支持64位程序的解决办法

[复制链接]
ylj135cool 发表于 2020-4-18 10:29:22 | 显示全部楼层 |阅读模式
先说一下我的使用环境:
系统:Windows 10 X64
Halcon版本: 17.12
开发语言:C#

最近看到了Halcon的HDevEngine,可以在外部语言中像调用脚本一样的执行Halcon程序和过程,就想试试,说一下实验情况。
1、采用Any CPU(没勾选首选32位)此时halcon.dll使用的是64位版本,并且在new HDevEngine()前可以正常new HImage对象(具体情况见下图)
在执行private HDevEngine MyEngine = new HDevEngine();时抛出以下异常:

“System.BadImageFormatException”类型的未经处理的异常在 hdevenginedotnet.dll 中发生
其他信息: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

(此时程序是64位程序)

(此时程序是64位程序)

2、采用AnyCPU(勾选首选32位)
此时halcon.dll使用的是64位版本,一切都可以正常运行,见下图。

(此时程序是32位程序)

(此时程序是32位程序)



那么问题来了,不论是32位程序还是64位程序,在new HImage对象可以正常调用(事实是除了hdevenginedotnet.dll库中包含的内容以外的都可以正常使用),而偏偏在使用Engine相关的内容时就不支持64位了,会提示试图加载格式不正确的程序,


3、我也实测过,当程序编译为32位应用程序,并使用32位版本的Halcon.dll也不能正常使用,原因也是因为Engine引起的,详情见下图:
4.png
这个错误很奇怪,此时程序是32位的,但是替换成64位的halcon.dll后就一切正常了。


得出以下结论,当使用HDevEngine类库中的内容时,必须将程序编译位32位应用程序,同时使用64位版本的halcon.dll,才可以正常运行。


请各路大神指教下是什么原因?

(此时程序是64位程序)

(此时程序是64位程序)
 楼主| ylj135cool 发表于 2020-4-18 15:51:42 | 显示全部楼层
以上问题已经解决,主要原因可能是几个dll的版本混乱了导致的,有些内容可能是旧版本的dll中没有的或者签名不一致的,所以会报错。经过修正后,全部采用统一版本的dll问题就没有了
平时我们使用部分常用功能只需要放入Halcon.dll即可,但是使用HDevEngine需要额外的几个dll,如下截图: 5.png


再次谢谢论坛。
Princess 发表于 2020-4-19 17:34:10 | 显示全部楼层
给楼主我的一些经验,仅供参考:
1.如果是应用程序内部直接使用引擎,建议不要用any cpu了,我的环境和你的差不多,不过halcon用的是12版本的,也是x64位的,工程直接配置成64然后使用,没有任何问题!
2.引擎如果需要封装到dll中,那么一定要用any cpu(不要问我为什么这个是软件要求的),但是halcon是64位,如果写了构造函数或load调用了引擎相关操作的必然会引发BadImage错误,所以坚决不能在这两个函数里面进行初始化。
3.使用any cpu会根据系统位数进行编译,勾选优先32位可能导致意想不到的错误,一般保持位数一致就不会错!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表