C#程序无法在64位系统上运行之.NET编译的目标平台

上一篇 / 下一篇  2015-12-16 11:48:19

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

解决方法:

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

 

追究原因:

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

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

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

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

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

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

具体行为如下:

64Windows操作系统上:

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

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

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

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

32Windows操作系统上:

x86anycpu编译的程序集将在32CLR上执行。

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

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

 

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

X86X64

脑硬件CPU可以分为x86x64, 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,还有X86X64.这些有什么不同?根据名字,我们可能认为,编译器会根据选择的环境不同来生成不同的二进制文件。然而,C#编译器只是把代码编译成为了IL代码,以dll的形式。然后再程序运行的时候,JIT编译器才把IL代码编译为CPU能够识别的二进制码。所以,无论选择哪个环境,都不会影响dll的生成,只是在dll的头文件中加入了一些平台信息,最终运行的时候JIT会根据这些信息来编译dllCPU处理

举例:

A项目是Console Application, B项目是Class Library,64位操作系统的机器上。A项目为Start Project,决定了这个程序的32位还是64位的属性。如果A设置为x86, A决定了这个程序为32位,B设置为x86,因为两个项目都是同一类型,虽然都是32位,但可以在64位系统上运行。如果AAny CPU, Bx86,就会出问题。因为A虽然为Any CPU,但是在64位操作系统上运行,就会转换成64位的dllA决定了这个程序为64位,然后再调用32位的dll,就会出问题。如果Ax86, BAny 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位的程序,效率不高,浪费了我们的资源


TAG: 程序

 

评分:0

我来说两句

日历

« 2024-01-08  
 123456
78910111213
14151617181920
21222324252627
28293031   

我的存档

数据统计

  • 访问量: 3792
  • 日志数: 2
  • 建立时间: 2015-12-15
  • 更新时间: 2015-12-16

RSS订阅

Open Toolbar