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

解决方法:

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

追究原因:

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

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

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

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

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

X86与X64:

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

举例:

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

[转]C#程序无法在64位系统上运行之.NET编译的目标平台的更多相关文章

  1. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  2. 64位系统上运行32位程序能否申请到8G内存?

    申请不到,因为64为系统在运行32位程序的时候只是为了向下兼容而已,对于32位程序来讲,申请8G的存储空间没有任何意义,因为32位的程序最大寻址空间只有4G,32位程序在编译之后的机器代码也只有32位 ...

  3. 32位vs2010的项目如何在64位系统上运行

    64位注册 1. 关闭Visual Studio.2. 在Visual Studio Tools目录,以管理员身份运行Visual Studio Command Prompt (2010),[注:这个 ...

  4. 解决C#的64位打包程序,在64位机器上运行出现BadImageFormatException异常。

    转载自:http://msdn.microsoft.com/zh-cn/library/system.badimageformatexception%28v=vs.100%29.aspx BadIma ...

  5. 关于32位程序在Win7&64位系统中连接Microsoft Excel数据源的问题

    最近在新公司电脑上跑以前的selenium测试框架的时候,抛出了如下的错误 出现的是ODBC Driver问题:[Microsoft][ODBC Driver Manager] Data source ...

  6. 32位程序在64位系统上获取系统安装时间(要使用KEY_WOW64_64KEY标记)

    众所周知,取系统的安装时间可取注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion的子项InstallDate,此值是个 ...

  7. 呃,如何使 .NET 程序,在 64位 系统 中,以 32位 模式运行。

    其实最简单的方法就是在解决方案中,把平台设为 x86 就好了哈~   但是今天遇到一个第三方的软件,它调用的一个 dll 是 32位 的,可能它没有测试过在 64位 系统下运行的情况,它在编译时是按默 ...

  8. C# 32位程序在64位系统下运行中解决重定向问题

    在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制.目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与 ...

  9. 使用visual c++ 2005远程调试64位系统上32位与64位程序

    一直都挺喜欢使用visual c++远程调试代码,它能展现给我们当时代码执行最真实的情景,今天有时间记录一下,以免以后忘了. 远程调试需要在被调试端安装服务器,对于visual c++ 2005来说调 ...

随机推荐

  1. Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)

    通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...

  2. php大力力 [052节] php数据库页面修改功能

    php大力力 [052节] php数据库页面修改功能

  3. WebSocket通信协议

    var ws = new WebSocket("ws://echo.websocket.org"); ws.onopen = function(){ws.send("Te ...

  4. linux通过端口号查找程序执行路径

    第一种: 查看ssh服务 [root@localhost shell]# netstat -anlp | grep :22tcp        0      0 0.0.0.0:22          ...

  5. Appium常用的API函数

    在学习应用一个框架之前,应该了解一下这个框架的整体结构或是相应的API函数.这篇文章还不错:http://blog.sina.com.cn/s/blog_68f262210102vzf9.html,就 ...

  6. Record:Handle onClick for our custom LinearLayout for Gallery-like HorizontalScrollView

    Handle onClick for our custom LinearLayout for Gallery-like HorizontalScrollView   The post "Im ...

  7. amazon oa1 - search in 2D array II [Leetcode] 240

    https://leetcode.com/problems/search-a-2d-matrix-ii/ 巧解题,矩阵本身等于了一个binary search tree,从中值开始走 时间复杂度 O( ...

  8. 【转】关于编写性能高效的javascript事件的技术

    原文转自:http://blog.jobbole.com/80170/ 如何能做出高效的web前端程序是我每次做前端开发都会不自觉去考虑的问题.几年前雅虎里牛逼的前端工程师们出了一本关于提升web前端 ...

  9. IOS 错误 [UIWebView cut:]: unrecognized selector sent to instance

    那在什么场景中会出现这种情况呢? 如果一个包含文字的输入元素有焦点,然后按钮的点击会导致输入失去焦点,然后接下来在输入时双按会重新得到焦点并从弹出bar中选择剪切复制粘贴,就会导致此error. 也就 ...

  10. @html.ActionLink的几种参数格式

    一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是该链接要显示的文字,第二个参数是对应的控制器的方法, ...