相关文章推荐
旅途中的柿子  ·  Error Installing ...·  1 年前    · 
帅气的匕首  ·  linux下gcc编译选项 - ...·  1 年前    · 

一、在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
    //未来肯定有

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

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

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

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

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

如果大家发现有什么不正确的地方,记得给我留言哦! 最近在做的项目涉及到32位以及64位的问题,查看了很多资料,大部分都是如下这样的解释。一、在VisualStudio中,编译设置有如下选项:    x86: 将程序集编译为由兼容 x86 的 32 位公共语言运行库运行。    x64: 将程序集编译为由支持 AMD64 或 EM64T 指令集的计算机上的 64 位公共语言运行库运行。    anycpu:(默认值)将程序集编译为在任意平台上运行。...
最近在C#项目中嵌入一个视频软件Ffplayer,出现报错现象,提示平台开发视频.dll文件的兼容性和加载格式不正确的问题。最终查看是由于项目平台选择的是Any CPUX86的引起的。目标平台有什么作用,各选项有什么差别。     一、在VisualStudio中,在编译设置中有如下选项:     x86: 将程序集编译为由兼容 x86 的 32 位公共语言运行库运行。
1.宿主程序(main方法)使用anycpu编译运行 2.引用的dll使用了三方C/C++dll,只能使用X86/X64编译.此时生成时会提示"编译框架不匹配,可能无法使用".并且主程序运行时报"未能加载XXdll" 解决方法: 1.主程序(anycpu)使用反射的方式加载.   1) 32位(XP系统)只能使用x86的dll   2) 64位系统只能使用x64dll 2.主程序(x8
×86:将程序集编译为由兼容×86的32位公共语言运行库运行。 ×64:将程序集编译为由支持AMD64或EM64T指令集的计算机上的64位公共语言运行库运行。 Any CPU:(默认值)将程序集编译为在任意平台上运行。 ltanium:将程序集编译为由采用ltanium处理器的计算机上的64位公共语言运行库运行。
不要做A位代码修改为B位代码的无用功。 也不要做用A位代码直接调用B位代码库这样复杂、这样容易出错的傻事。 只需让A位、B位代码的输入输出重定向到文本文件,或修改A位、B位代码让其通过文本文件输入输出。 即可很方便地让A位、B位两种代码之间协调工作。 关于.NET编译的目标平台(AnyCPU,x86,x64)(转) 今天将调用SAP的RFC函数的C#接口程序正式放到客户服务器,更新后反馈x64...
平时开发C#时候,经常会遇到这个错误,其他信息: 未能加载文件或程序集"32BitLib, Version=1.0.0.0, Culture=neutral,PublicKeyToken=null"或它的某一个依赖项。试图加载格式不正确的程序,由此拉开程序集多少位大幕。 (一) bit位查看 要查看多少位程序集,可以利用VS2013 开发人员命令提示,打开这个.bat,可以发现里面配了很多环境路径,无非里面有一些.exe,用命令行启动程序而已。查看c#程序集dll,用一个corflagse.xe工具,在
在VisualStudio中项目平台属性包含x86/x64/AnyCPU三个选项,之前的项目中并没有特别去关注这一点,最近的项目中涉及到了在不同平台运行的问题,所以专门了解并整理了这方面的知识。x86/x64/AnyCPU的含义在vs中这一选项被称为“目标平台”,也就是编译成功的项目最终是要在什么平台上运行。 编译(目标)平台 含义 x86 将程序集编译为由兼容 x86 的 32 位公
亲测有效,感谢原创作者! 在C#中如果要使程序自适应32位和64位系统,只需要将项目的“目标平台”设置为“Any CPU”就行了,但是如果程序中使用了SQLite组件,则需要对该组件额外进行一些简单的设置: 一、下载System.Data.SQLite组件: 从官网(h...