关于C#编译方式的一些说明(x86\x64\anycpu)

最近在做的项目涉及到32位以及64位的问题,查看了很多资料,大部分都是如下这样的解释。

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

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

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

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

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

    二、具体行为如下:

    1)在 64 位 Windows 操作系统上:

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

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

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

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

    2)在 32 位 Windows 操作系统上:

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

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

 我们重点关注Any CPU这一种方式,因为这种方式是最灵活的一种,在32位下,EXE将以32位执行,而在64位下,EXE将以64位执行。于是我用dumpbin工具查看和验证,我的机器是win7 64位,在使用anycpu进行编译时,exe确实为64位格式,截图如下:


x86编译后,截图如下:


anycpu编译如下:(勾选首选32位)

    

anycpu编译如下:(未勾选首选32位)


通过这种方式发现,和我们预期的结果不一样,按理说最后一个应该是64位的,然后我们看到的结果为32位,为什么会这样呢?难道是dumpbin不适用于c#,但是为什么x64,x86编译的方式又是正确的,或者anycpu这种的描述是错误的,永远不会生成64位?一直没有找到合适的解答,最后,终于找到合适的解释了,那就是在x86,x64这2种编译方式用dumpbin是没问题的,对于anycpy,系统做了特殊处理,因此dumpbin可能不适合了,那我们怎么来判断是32位还是64位呢?我又找到另外的一种方法。

1、根据IntPtr.Size来判断,如果值为4则是32位,如果为8则是64位,所有.NET版本都支持。

if (IntPtr.Size == 4)
{
    // 32-bit
}
else if (IntPtr.Size == 8)
{
    // 64-bit
}
else
{
    //未来肯定有
}

2、如果.NET的版本是4.0或之后,则可以用Environment.Is64BitProcess来判断当前进程是否是64位的。

if(Environment.Is64BitProcess)
{
   //64-bit
}
else
{
   //估计很长一段时间内都是32-bit
}

于是用这种方法对anycpu编译的exe再次进行测试,发现果然是正确的,在我的机器上(win7 64位)anycpu,勾选“首选32位”生成的32位程序,未勾选“首选32位”,则生成的64位。我的疑惑终于得到了解答。

因此,在使用什么方式编译时,给大家都建议如下:

dll使用anycpu选项编译,不勾选“首选32位”,exe如果想生成位64位,则用x64,如果想生成32位,则用x86,如果想跟随系统变化,则位anycpu。

如果大家发现有什么不正确的地方,记得给我留言哦!
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值