前言:
在进行完c#的winform程序开发后,需要编译成release版的可执行文件发布给客户,而在打包的过程中,会涉及目标平台的选择、以及.net framwork的选择。若选择不当,则会导致在客户电脑上无法运行的情况。
所以出现无法运行的情况,原因有二:一是目标平台没选对,二是.net framwork没匹配。
什么是目标平台呢?
1、目标平台
目标平台指的是PC的CPU,这里又特指CPU的内核架构。对于通用CPU来说,目前只有Intel和AMD两家公司的产品,为了实现不同型号的cpu之间,机器码的通用性,约定了架构的规范,也就是微处理器执行的计算机语言指令集。
Intel从8086开始,286、386、486、586、P1、P2、P3、P4都用的同一种CPU架构,统称X86。现在说X86一般指32位的CPU;
“x86-64”,有时会简称为“x64”,是64位微处理器架构及其相应指令集的一种,也是Intel x86架构的延伸产品。
X86的cpu只能安装32位的操作系统;X86-64的cpu可以安装32位以及64位的操纵系统,但是还需要看内存的大小,若小于4G,也是没有必要安装64位系统的。对于应用程序,64位系统可以运行32位和64位的应用程序,而32位系统只能运行32位的应用程序。
这里的CPU的内核架构只是CPU参数的其中一个,除此之外还有主频,外频,倍频,接口,缓存,制造工艺,电压,封装形式,整数单元和浮点单元等。在windows系统下可以使用驱动精灵来查看CPU参数,在ubuntu系统下,可以输入lscpu:
那如何选择目标平台呢?
1.1 目标平台的选择
有三种选择:Any_CPU、X86、X64。同时,这里涉及到编译exe和dll,因为一个应用程序多少会引用第三方类库(dll文件)。
Any CPU编译的dll,被哪种类型的程序(exe)调用,就会编译成哪种类型的dll。
Any CPU编译的exe,取决于当前的操作系统,若是64位系统,就编译成X86的。
当然,若指定x86和x64,也就对应生成该类型的dll和exe.
所以,在编译exe、配置目标平台时,需要考虑:
1.引用的dll是什么类型的;
2.客户的PC是多少位的系统。
最方便的一种就是,Any CPU编译的dll 加上 X86编译的exe,可以在任何PC上运行。当然也有缺点,就是64系统来运行X86应用程序,利用效率不高。
2、.NET framwork
当然是版本越高,支持的功能越全,但是要考虑到客户的电脑系统是否可以支持安装高版本的framwork,否则也是运行不了的,因为framwork一般是向下兼容,高版本可以运行低版本下开发的应用程序,反之可能不行。这是为什么呢?
因为c#作为解释性语言(关于解释性语言,可以参考我的另一篇博客:https://blog.csdn.net/Boooooots/article/details/88924747),它的编译分两步,第一步是编译成IL(中间代码),以exe或dll存在,然后在程序运行的时候,JIT编译器才把IL代码编译为CPU能够识别的二进制码。
所以打包时的程序(exe)其实是个“半成品”,它并不能直接运行,而是需要framwork的支撑,那么就可能出现程序开发的时候选择的高版本framwork,并且用了其中的类、数据结构等,就会导致低版本的framwork的JIT编译器在编译时出现加载错误。
比如在framwork 3.5使用framwork 4中的windows media player就会出现以下异常:
所以尽量不用最新的framwork版本开发,因为你的客户可能还在用windows xp或win7。免去系统版本低导致安装不上framwork高版本的麻烦。
3.本质
代码打包后不能运行的本质是:依赖了出问题,可以是依赖的.net环境、操作系统、配置文件的部署等等。