如果说你编译的exe运行时报错:

“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”

这很有可能是你是以非托管的方式错误地引用了64位的API中去。

为什么会这样?

那你就要考虑VS的编译器选项 /platform

VS编译目标platform有这样的3个选项:AnyCPU,x86和x64。

如果一个程序被编译成AnyCPU,那么程序将包含2套相同逻辑的程序,一套在32位系统上用,另一套在64位系统上用。问题的原因就在这里。

如果你是在32位系统上用AnyCPU编译了代码,那么代码调用的时32位COM,在32位系统上是以32位方式运行,32位APP调用32位COM,着当然没问题。但是如果其他人在64位系统上调用你的程序,则程序是以64位APP调用32位COM。(既然这样那AnyCPU又有何用?!这其实是个鸡肋!所以为了解决这个问题,ms又给出了另一个参数:anycpu32bitpreferred,但这个只支持NET4.5以上)

解决方法就是:将其固定到具体的平台!如:x86,让他直接以兼容x86的指令集来运行程序!

微软MSDN:

/platform:string

参数

string

anycpu (默认值),anycpu32bitpreferred、ARM、x86、x64 或 Itanium。

anycpu (默认值) 在所有平台编译您的程序集运行。 只有该模式可用时,您的应用程序运行作为 64 位进程尽可能并返回 32 位的流程。

anycpu32bitpreferred 将程序集编译成可在任何平台上运行。 您的应用程序在支持 64 位和 32 位应用程序的系统上为 32 位模式下运行。 可以为面向 .NET framework 4.5 的项目仅指定此选项。

ARM 在有高级 RISC 设备 (ARM) 处理器的计算机上编译您的程序集运行。

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

x86 编译 32 位,x86 兼容的公共语言运行时所的程序集。

Itanium 生成在一台计算机上的 64 位公共语言运行时所的程序集具有 Itanium 处理器。

在 64 位 Windows 操作系统上:

程序集编译 /platform:x86 在运行于 WOW64 下的 32 位 CLR 执行。

DLL 编译 /platform:anycpu 在与处理它加载的 CLR 执行。

编译 /platform:anycpu 的可执行文件在 64 位 CLR 执行。

可执行文件在 32 位 CLR 生成了 /platform:anycpu32bitpreferred 执行。

anycpu32bitpreferred 设置为可执行文件 (.EXE) 文件才是有效的,因此,它需要 .NET framework 4.5。

设置方法:

打开项目的“属性”页。

单击“生成”属性页。

修改 目标平台 属性,因此,面向 .NET framework 4.5 中,选择或清除 首选 32 位 复选框的项目。

另:

可以使用.NET SDK中提供的CorFlags命令查看程序集的目标平台,也可以修改它,这样就可以不用重新编译了。

C# 编译器选项 /platform(指定输出平台)32位程序运行到x64平台的问题的更多相关文章

  1. Ubuntu14.04 64位运行32位程序

    最近公司新增的机器安装Ubuntu14.04 64bit导致之前在32bit下编译的Qt工具软件无法运行. 于是google的了一下找到一些解决办法,但不能保证全部32bit的Qt程序都能正常,测试了 ...

  2. 转:如何在32位程序中突破地址空间4G的限制

    //如何在32位程序中突破地址空间4G的限制 //首先要获得内存中锁定页的权限 #define _WIN32_WINNT 0x0501 //xp系统 #include <windows.h> ...

  3. 记32位程序(使用3gb用户虚拟内存)使用D3DX9导致的一个崩溃的问题

    为了增加32位程序的用户虚拟内存的使用量,我们使用了/LARGEADDRESSAWARE编译选项来使32位程序可能使用到3gb的内存,能否使用到3gb内存也跟平台.系统和设置有关系,现摘抄部分作为参考 ...

  4. 使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表

    原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表 我们知道目标平台是32位的程序运行在64位的系统上,去访问部分注册表的时候系统自动重定向到win32node节点对应的 ...

  5. VS2013下的64位与32位程序配置

    VS2013下的64位与32位程序配置   在Windows 7 64bit和Visual Studio 2013下生成64位程序. 新建一个Visual Studio Win32 Console项目 ...

  6. 64位ubuntu编译32位程序

      最近在64位ubuntu上开发,需要编译32位程序,需要安装这两个包,然后在编译器参数加上-m32.不放心的话可以用ldd或file查看一下是否生成了对应位数的程序. $ apt-get inst ...

  7. C# 32位程序访问64位系统注册表

    原文:C# 32位程序访问64位系统注册表 我的上一篇文章已经阐述了“32位程序和64位程序在64位平台上读\写注册表的区别”,那么接下来将要回答上篇所留下来的一个问题:32位程序如何访问64位系统注 ...

  8. win764位系统上让32位程序能申请到4GB内存方法

    win764位系统上让32位程序能申请到4GB内存方法. 2016年09月18日 18:36:26 阅读数:1550 最近测试一个32位程序总是在1.2G左右内存时崩溃,怀疑是内存申请失败,本身32位 ...

  9. 使 32 位程序使用大于 2GB 的内存

    不管在 32 位 Windows 上还是在 64 位 Windows 上,32 位的应用程序都只能使用最大 2GB 的内存,这是我们司空见惯的一个设定.但其实 Windows 提供了一些方法让我们打破 ...

随机推荐

  1. C++ tree(1)

    建立与基本操作 .有关二叉树的相关概念,这里不再赘述,假设不了解二叉树相关概念,建议先学习数据结构中的二叉树的知识点 准备数据 定义二叉树结构操作中须要用到的变量及数据等. #define MAXLE ...

  2. 走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串

    原文:走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串 对大量数据进行查询时,可以应用到索引技术.索引是一种特殊类型的数据库对象,它保存着数据表中一列或者多列的排序结果,有 ...

  3. SQLite外键

    数据库工具:SQLite Manager(V0.7.7) SQLite版本号:V3.6.19+ SQLite Manager 默认是不开启外键的. 那么怎样,使用它创建一个带有外键的表呢? 一.开启外 ...

  4. Spark1.0.0 学习路径

          2014-05-30 Spark1.0.0 Relaease 经过11次RC后最终公布.尽管还有不少bug,还是非常令人振奋. 作为一个骨灰级的老IT,经过非常成一段时间的消沉,再次被点燃 ...

  5. Java流

    流是一组有顺序的,有起点和终点的字节集合,是对传输数据的总称或抽象.即数据在两设备间的传输称为流,流的本质是传输数据,依据传输数据特性将流抽象为各种类,方便更直观的进行数据操作. 流的分类: 数据类型 ...

  6. OUC_OptKernel_oshixiaoxiliu_好题推荐

    poj1112 Team Them Up! 补图二分图+dp记录路径codeforces 256A Almost Arithmetical Progression dp或暴力 dp[i][j] = d ...

  7. HTML5实现刮奖效果

    原文:HTML5实现刮奖效果 要实现刮奖效果,最重要的是要找到一种方法:当刮开上层的涂层是就能看到下层的结果.而HTML5的canvas API中有一个属性globalCompositeOperati ...

  8. google面试题,男孩男女比例?

    Google面试题: 在一个重男轻女的国家里,每一个家庭都想生男孩.假设他们生的孩子是女孩.就再生一个,直到生下的是男孩为止,这种国家.男女比例会是多少? 答案:1:1 分析:  出生男女概率是50% ...

  9. EasyUI基础入门之Resiable(可缩放)

    easyui的base插件学习已经进行到Resizable(可缩放)了.照旧看看easyui官网的API. Resiable 正如其字面意思一样(可伸缩),resiable主要是将一些html元素扩展 ...

  10. swift 注意事项 (十六) —— 可选链

    可选链(Optional Chaining) 我们都知道"可选型"是什么.那么可选链又是什么,举个样例解释一下: struct MyName{      var name } st ...