zoukankan      html  css  js  c++  java
  • [转]C#程序无法在64位系统上运行之.NET编译的目标平台

    今天将编译的C#的exe拷贝到测试机上(Win7_64bit),一运行就挂了,提示“stop working”,一开始怀疑测试机上没有安装.net framework框架,追究半天原来是编译的目标平台选择错误。

    解决方法:

    Project Property-》Build-》Platform. target,将默认的any cpu选择为x86,重新编译程序后再拷贝到测试机上运行就没有问题了。

     

    追究原因:

    首先看看这个目标平台有哪些选项,有什么区别吧。

    在VisualStudio中,在编译设置中有如下选项:

    x86: 将程序集编译为由兼容x86的32位公共语言运行库运行。

    x64: 将程序集编译为由支持AMD64或EM64T指令集的计算机上的64位公共语言运行库运行。

    anycpu:(默认值)将程序集编译为在任意平台上运行。

    Itanium: 将程序集编译为由采用Itanium处理器的计算机上的64位公共语言运行库运行。

    具体行为如下:

    在64位Windows操作系统上:

    用x86编译的程序集将在WOW64下运行的32位CLR上执行。

    用x64编译的程序集将在64位CLR上执行。

    用anycpu编译的可执行文件将在64位CLR上执行。

    用anycpu编译的DLL将在与加载它的进程相同的CLR上执行。

    在32位Windows操作系统上:

    用x86或anycpu编译的程序集将在32位CLR上执行。

    用x64编译的程序集无法运行。

    按照上面的解释,我的程序选择目标平台为any cpu,应该也可以在64位系统上运行啊,为什么运行不起来呢,原来是程序有调用其他的dll,而这些dll都是32位的,我的程序在64位系统上会以64位程序执行,但是不能调用32位的dll,所以就出错啦。

     

    以下内容为转载哦,感觉作者讲的很清楚很透彻。

    X86与X64:

    脑硬件CPU可以分为x86与x64, x86的机器只能安装32位的操作系统,如XP, WIN7_86, x64的机器既可以安装32位的系统,又可以安装64位的系统,只是在x64的机器上安装32位的系统,不能够很充分的利用这台机器的资源。x86程序,即适用于32为操作系统的程序,x64即适用于64位操作系统的程序。64位系统上依然可以运行32位的程序,但是这是通过WOW64来运行,通俗上讲,就是模拟出一个32位的CPU来运行这个程序。

    C#程序的编译运行:

    C#程序的编译运行,分为两步,第一步是编译成IL,在编写C#程序的时候,需要考虑到在最终程序需要在哪种环境下运行。Build中默认的环境是Any CPU,还有X86,X64.这些有什么不同?根据名字,我们可能认为,编译器会根据选择的环境不同来生成不同的二进制文件。然而,C#编译器只是把代码编译成为了IL代码,以dll的形式。然后再程序运行的时候,JIT编译器才把IL代码编译为CPU能够识别的二进制码。所以,无论选择哪个环境,都不会影响dll的生成,只是在dll的头文件中加入了一些平台信息,最终运行的时候JIT会根据这些信息来编译dll给CPU处理。

    举例:

    A项目是Console Application, B项目是Class Library,在64位操作系统的机器上。A项目为Start Project,决定了这个程序的32位还是64位的属性。如果A设置为x86, A决定了这个程序为32位,B设置为x86,因为两个项目都是同一类型,虽然都是32位,但可以在64位系统上运行。如果A为Any CPU, B为x86,就会出问题。因为A虽然为Any CPU,但是在64位操作系统上运行,就会转换成64位的dll,A决定了这个程序为64位,然后再调用32位的dll,就会出问题。如果A为x86, B为Any CPU,就不会出问题。因为A决定了这个程序为32位,调用B的时候就会把B转成32位,一切正常。

    问题一:可以一直把Project设置为Any CPU吗?

    因为现在很多的系统都是64位的,所以我们的程序设置成Any CPU,在64位机器上跑的时候就是64位的程序,但是这些程序很多时候需要使用一些组件,比如COM组件等,而这些组件仅仅是32位的dll,根本不支持64位,当我们用64位的程序调用这些dll的时候就会有问题。所以,这时候,我们就需要把我们的程序设置成x86。

    问题二:可以一直把Project设置为X86吗?

    那么现在我们就要保证我们的程序引用的dll都是32位的。虽然很多第三方的dll都提供32位与64位两个版本,基本上可以保证这一点。但是如果没有必要做成32位的程序,单纯是为了方便,我们前边说过64位的系统运行32位的程序,效率不高,浪费了我们的资源。

  • 相关阅读:
    面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
    位运算技巧3
    Android消息循环分析
    ubuntu安装软件的方式
    fragment Trying to instantiate a class com.example.testhuanxindemo.MyFragment that is not a Fragmen
    LAN路由
    php 简易验证码(GD库)
    飘逸的python
    它们,不能是虚函数!!!
    HTML5调用摄像头实现拍照功能(兼容各大主流浏览器)
  • 原文地址:https://www.cnblogs.com/adylee/p/5359728.html
Copyright © 2011-2022 走看看