前言
在VS工程中,有的dll库版本是32位的,有的是64位的。因此在编译器中debug的过程中,没有任何问题。但是直接打开bin目录里面的exe文件,会提示错误,因此,使库版本统一成为一个需要解决的问题。
问题发现
在部署.net项目时,发现了一个问题,某些库文件无法加载,提示如下错误:
Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'xxx', ......试图加载格式不正确的程序
- 这个问题经过查证是由于使用到的leveldb库和.net项目中加载的库版本不对,所使用的库文件是32位的,而通过nuget加载的Leveldb.Net.dll库是只有64位或者其它platform,无法兼容x86,在运行时,程序无法识别。
-
另外一点,在VS工程的属性中,
选中了Prefer 32-bit,因此程式以32bit mode进行运行,也导致了无法加载。
解决办法
网上有大神说使用动态加载的方式,即64位加载64位dll,32位加载32位的dll。搞了好久没有搞定,我在这里阐述一下我的解决办法吧。
- 下载leveldb的源码放入vs中,进行编译生成dll。或者直接下载大神已经集成好的.net工程,下载链接。
-
自己手动集成编译环境的大神请无视以下内容。如果下载的是已经集成好的.net工程,需要注意的是,该工程中的platform没有x86或者win32平台,需要在platform中添加一下。
-
在编译时,选择release,平台选择Win32,这样便兼容了32位程式。
- 替换package文件夹中的dll文件,clean & rebuild。
这样解决完成之后,再次部署运行,可以正常运行了。
结束语
一般情况下,自己编写的dll库是不会出现这样的问题,只有当使用到第三方的dll库时(使用DllImport进行引入),才会发生,因为在使用时需要根据其编译的platform进行特殊设定,才可以使其运行。
本文列举了一种方法,使leveldb.net.dll更好的兼容项目。或许项目的特殊性使本方法不太适用于所有的项目,但是这是一种思想,到具体项目时,可以具体情况具体分析。也希望各位读者在遇到诸如此类问题可以私信我,一起找到原因,发现问题,解决问题,获取成就感和自信。