C# DllImport 部分问题处理 (持续更新)
最近在开发过程中,已经连续两次遇到DllImport的问题,由于对这方面的开发不熟悉,在解决问题的过程中,找不到头绪,浪费了很多的时间。本篇文章,我将我所遇到的问题及其解决方法进行一个记录,仅仅是记录,希望能够帮助那些焦头烂额像我一样找不到头绪的新手,也希望各位牛逼大侠帮助我对这些问题的解决处理给出准确与想尽的解释,不足之处,还希望大家批评指正。本文将会持续更新,用于记录我在开发过程中遇到的和DllImport相关的一些问题。
1. 异常"DllNotFoundException was unhandled"
问题描述:
之前在32位XP下用VS2010开发的一个程序运行正常,但是当我换了一台新电脑,在64位Win8下运行,就报出了这样的异常:Unable to load DLL 'ACR120U.DLL': The specified module could not be found. (Exception from HRESULT: 0x8007007E)。截图如下:
实际上,我所调用的这个DLL文件是包含在System32的文件夹下的,但是不知道为什么,他却始终找不到。大家知道,一般我们在C#的开发中,如果直接写[DllImport("***.DLL")],那么DllImport会按照顺序去寻找dll文件:1)exe文件所在目录;2)System32目录;3)环境变量目录。所以这个时候,我把dll文件放到了exe文件所在的目录,心里寻思着这次应该可以找到了吧。的确,功夫不负有心人,的确是找到了,但是出现了新的问题,此时报出异常“BadImageFormatException was unhandled”,详细内容为:An attempt was made to load a program with an incorrect format. (Exception from HRESULT:0x8007000B)。截图如下:
解决方法
实际上,出现这两个问题最主要的原因是我运行环境的问题,也即我尝试在64位Win8下运行一个在32位XP下写的程序,乍一看,就会发现跨度比较大,实际上解决方法也还是很简单的。
右键打开项目的属性,然后选择Build选项卡,查看General下的Platform target选项,之前我的选择是x86,此时选中x64,或者选择Any CPU,然后保存,再次运行程序,一切OK,问题解决!
并且,也不需要非要把dll文件放在exe所在的目录,只要System32或者环境变量的目录下有就OK了。