• 关于.NET编译的目标平台(AnyCPU,x86,x64)


    转载:http://blog.sina.com.cn/s/blog_78b94aa301014i8r.html

    今天有项目的代码收到客户的反馈,要求所有的EXE工程的目标平台全部指定成x86,而所有DLL工程的目标平台全部指定成AnyCPU 。

    下面我们一起看看这个目标平台有什么作用,各选项有什么差别吧。

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

    关于.NET编译的目标平台(AnyCPU,x86,x64)

    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 编译的程序集无法运行。

    搞清楚这些差异以后,回过头来看看客户要求的东西,有没有道理吧。

    首先有一点是知道的,客户希望程序能够在WINXP以上的各系统中运行(不管是32位还是64位)。

    因此,不可能选x64,Itanium这种针对特殊处理器的也不会去选。

    那都选择Any CPU这种默认方式有没有问题呢?

    首先看看Any CPU和x86的可执行文件(EXE)在32位和64位下有什么区别吧,

    Any CPU在32位下,EXE将以32位执行,而在64位下,EXE将以64位执行。而x86的话,始终以32位执行。

    客户希望使用的x86,也就是不希望64位下用64位方式执行EXE程序。我分析的原因是由于系统中可能存在第三方的32位DLL,一旦使用64位执行的EXE,在调用到32位的DLL时,将无法调用。

    而DLL,客户则希望采用Any CPU,我分析的原因是DLL的实际运行方式是受调用它的EXE所影响的,因此设为Any CPU就可以了。而如果设定为x86,虽然看似没什么问题,但其无法在64位CLR中运行了,不是太好。

    参考资料:

    http://msdn.microsoft.com/zh-cn/library/zekwfyz4(VS.80).aspx

    ------------------------------

    补充一下,可以使用.NET SDK中提供的CorFlags命令查看程序集的目标平台,也可以修改它,这样就可以不用重新编译了。不过,为啥64位下的EXE无法调用32位的DLL呢?

  • 相关阅读:
    [MAC]如何抹掉 Mac 磁盘
    [MAC]出售、赠送或折抵 Mac 前该怎么做
    转载 软件项目计划如何编写举例
    GIT
    AWR实战分析之----direct path read temp
    ASM 磁盘组的的scrip
    巨杉db
    High waits on control file sequential read
    如何减小SQL 的物理读,。
    block size大小
  • 原文地址:https://www.cnblogs.com/zhaox583132460/p/3467549.html
Copyright © 2020-2023  润新知