VS项目调试使用x86,x64,Any CPU平台的区别
VS项目调试可以选择x86,x64,Any CPU,它们之间有什么区别?以往我也不怎么关注,最近在项目iis express里添加一个虚拟项目时,才意识到这个的影响。从网上找的资料,记录如下:
知识点
①dll(动态链接库)和exe(可执行文件):
Windows下有静态链接(lib)库和动态链接库(dll)两种共享代码的方式
动态链接库(Dynamic Link Library)又称为“应用程序扩展”,在windows系统中,大多数应用程序并非仅有一个可执行文件exe,同时也包含一些相对独立(模块化)的dll文件。dll中存放函数代码实现,exe中存放dll中相应函数代码的地址,而且dll中的代码可以被多个exe调用而在内存中仅保留一份拷贝,从而节省了内存空间。
x86、x64、Any CPU的区别
-
简单的说,它们之间最直接的区别就是:对应的编译出来的程序位数不同
x86平台编译出来的exe(可执行文件)或dll(动态链接库)都是32位的。以此类推,x64对应的则是64位的。而Any CPU则是取决于当前的操作系统,若操作系统是32位的,则编译出来的程序就是32位的,反之编译出来的就是64位程序。
-
若你的启动项目,即主程序(编译出来是exe文件的)是x86平台下编译的,而它所依赖的一个项目(或动态链接库)是由x64位平台编译出来的,则会提示“未能加载文件或程序集…或它的某一个依赖性。试图加载格式不正确的程序。”之类的错误。这是因为32位程序不能加载64位的dll,更不能调用其中的类、方法和对象等。
反之,若主程序是由x64平台编译出来的,而dll是x86的呢?答案。也是不行的!说到这里,基本上可以确定一点:dll和主程序的生成平台只要一致就可以。
那么问题来了!若主程序是Any CPU编译的,而dll是由x86或者x64平台编译的,又或者,主程序是x86或者x64平台编译的,而dll是由Any CPU编译的呢?正确答案就是两者在“特殊情况”下都是可行的。
为什么说是“特殊情况”下呢?因为第一点(红色字体处)也提到了,Any CPU取决于操作系统,而结合第二点上半部分(红色字体处)提到的,只要dll和主程序的生成平台一致,那么也是可行的。
所以,由上可知:若主程序是在Any CPU平台下编译的,那么编译dll的平台必须要和编译主程序的操作系统一致才行。若主程序是在x86或者x64平台下编译的,那么dll就必须要和主程序一致(铁则)。
不过有个特例:若dll由Any CPU编译的,那么这个dll就可以被32位和64位的主程序调用。这是为什么呢?请看第三点。
-
虽说Any CPU编译出来的程序取决于操作系统,但是由Any CPU编译出来dll则取决于调用它的主程序,即若主程序是32位的,那么dll也是32位的,若主程序是64位的,那么dll就是64位的。所以dll一般采用Any CPU平台编译,而主程序一般采用x86平台编译。
在不清楚客户的电脑是什么类型的操作系统的情况下,或者两者都有的时候,则主程序采用x86平台编译,dll采用Any CPU平台编译
4.使用x86平台调试的时候,是可以一边调试一边修改代码的,而x64平台下则不行(启用了编辑并继续的)。如下图:
总结
1、x86平台编译出来的exe(可执行文件)或dll(动态链接库)都是32位的
2、x64平台编译出来的exe(可执行文件)或dll(动态链接库)对应的则是64位的。
3、Any CPU下的exe取决于当前的操作系统,系统是32位的,则编译出来的程序就是32位的,是64位的就是64位程序。
4、Any CPU编译出来的程序取决于操作系统
5、Any CPU编译出来==dll则取决于调用它的主程序==
6、由于系统中可能存在第三方的32位DLL,一旦使用64位执行的EXE,在调用到32位的DLL时,将无法调用
7、dll一般采用Any CPU平台编译,而主程序一般采用x86平台编译。
8、DLL的实际运行方式是受调用它的EXE所影响的,因此设为Any CPU就可以了
9、32位程序不能加载64位的dll,更不能调用其中的类、方法和对象
10、64位程序不能加载32位的dll,更不能调用其中的类、方法和对象
只要dll和主程序的生成平台一致,那么也是可行的