一、在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)
else if (IntPtr.Size == 8)
2、如果.NET的版本是4.0或之后,则可以用Environment.Is64BitProcess来判断当前进程是否是64位的。
if(Environment.Is64BitProcess)
于是用这种方法对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
CPU和
X86的引起的。目标平台有什么作用,各选项有什么差别。
一、在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...