在编译c#应用程序时设置平台有什么区别吗?

在编译c#应用程序时设置平台有什么区别吗?,c#,optimization,jit,compiler-optimization,cil,C#,Optimization,Jit,Compiler Optimization,Cil,在VS2012(和以前的版本…)中,您可以在构建项目时指定目标平台。不过,我的理解是,C#被“编译”到CIL,然后在主机系统上运行时进行JIT编译 这是否意味着指定目标平台的唯一原因是故意限制用户在某些体系结构上运行软件,还是强制应用程序在64位机器上以32位运行?我看不出这与优化有什么关系,因为我猜这是在CIL-->本机阶段发生的,而在主机体系结构上正好发生 似乎没有提供任何替代解释,我也找不到任何关于您应该(例如)发布同一应用程序的单独32/64位版本的建议-似乎为“anycpu”编译的东西

在VS2012(和以前的版本…)中,您可以在构建项目时指定目标平台。不过,我的理解是,C#被“编译”到CIL,然后在主机系统上运行时进行JIT编译

这是否意味着指定目标平台的唯一原因是故意限制用户在某些体系结构上运行软件,还是强制应用程序在64位机器上以32位运行?我看不出这与优化有什么关系,因为我猜这是在CIL-->本机阶段发生的,而在主机体系结构上正好发生

似乎没有提供任何替代解释,我也找不到任何关于您应该(例如)发布同一应用程序的单独32/64位版本的建议-似乎为“anycpu”编译的东西也应该运行,而且,优化将在JIT阶段应用

这是否意味着指定目标平台的唯一原因是故意限制用户在某些体系结构上运行软件,还是强制应用程序在64位机器上以32位运行

是的,如果您将本机代码与托管代码混合使用,这一点至关重要。但是,它不会改变在运行时优化的内容

如果您的代码是100%管理的,那么AnyCPU(或者新的AnyCPU更喜欢32位)可能就可以了。编译器优化将是相同的,JIT将在运行时基于当前执行平台进行优化

例如,我找不到关于您应该发布同一应用程序的单独32/64位版本的建议


除非您使用非托管代码执行互操作,否则没有理由这样做,在这种情况下,需要单独的32位和64位DLL。

里德在这里有一个很好的答案。但是,我认为还需要指出的是,此设置只是DLL中的一个标志-在大多数情况下,它几乎没有任何效果。运行时加载器(启动.NET运行时的本机代码位)负责查看此标志,并指示启动相应版本的.NET运行时

正因为如此,该标志仅在EXE文件上设置时才起作用,而在DLL上设置时不起作用。
例如,如果您有一个由64位标记的.NET EXE或任何cpu标记的.NET EXE使用的“32位标记的.NET DLL”,并且您在64位计算机上运行该EXE,则加载程序将启动64位运行时。当加载32位DLL时,为时已晚-已选择64位运行时,因此您的程序将失败(我相信您将收到一个BadImageFormatException)。p/Invoke或“不安全”内容是否取决于此设置?(我想这些可能被认为不是100%托管的.)@pst P/Invoke与本机相反,因此它在这方面很重要(除非在运行时有某种方法确保只使用正确的平台DLL),但这不是一个优化问题,而是一个正确性问题。@pst-是的。因为设置此平台标志(如果用于负责启动运行时的条目可执行文件)将导致代码加载到32位或64位内存空间中。如果您的p/invoke被编写为期望指针和其他特定于内存的类型为32位维度,并且它被加载到64位运行时(反之亦然),那么事情将失败。对于您希望限制平台的原因,我提供了另一个有效(尽管很小)的理由。在某些情况下,与64位相比,以32位运行可以减少内存消耗,因为所有对象引用仅为4字节而不是8字节。如果您知道自己永远不会消耗超过2GB的内存,强制使用32位可以减少程序的内存占用。@AllonGuralnek是的-一般来说,除非您需要64位,否则32位通常更好。我相信这就是为什么VS 2012的默认值现在是“AnyCPU更喜欢32位”,而不仅仅是AnyCPU的原因之一。+1非常好地补充了里德的答案。是的,关于
BadImageFormatException
错误,你是对的。我不知道它在VS2012中是否发生了更改,但在VS2010下以64位模式调试应用程序时,“编辑并继续”功能不起作用。@Davis:没有。(但现在可以使用E&C编辑包含匿名方法或lambda的方法体,减去它们出现的实际语句)