关于c#:为什么我们可以在平台无关的情况下更改.NET项目设置中的平台?

Why can we change the platform in .NET project settings when it is platform independent?

我正在使用Visual Studio 2010、.NET 4.0和WPF。我们正试图以平台作为"anycpu"来构建项目,这将使程序平台中立。在这样做的过程中,我开始迷惑自己。

我认为所有的.NET程序都以.NET框架为目标,而不是以操作系统为目标。如果是这样的话,我不应该担心我是在"x64"还是"x86"系统上工作。所有这些程序的目标都是.NET框架,它是一个适当的"运行时",可以自行处理。clr可以根据它所处的平台分配内存,但是.NET项目不必担心这一点。

我这里缺什么?在.NET项目中,构建设置中的"平台"有什么意义?


正如其他人提到的,当您使用为特定平台构建的其他库时,可能需要指定该平台。COM就是一个很好的例子。

假设您有一个32位的COM组件(大多数是),而客户机操作系统是32位的。如果您为"anycpu"编译,它将工作得很好,因为它将JIT到本机x86代码,因为您是在32位系统上运行的。

现在假设您拥有相同的COM组件,并且客户机操作系统是64位的。在Windows上,当COM组件注册后,它将在注册表的32位部分注册(我认为是ww6432节点)。因此,如果您将应用程序编译为"anycpu",它将是一个本机64位应用程序,并且无法调用COM组件(导致类未注册),因为它将在64位注册表中查找。如果为x64编译(因为它在JIT之后会产生相同的本机代码),则会得到相同的错误,但是如果为x86编译,则可以正常工作。


限制自己使用一个体系结构的一个常见原因是,您使用的本机库只支持一个平台。

例如,在我的一个项目中,我包含了libvorbis,我太懒了,无法编译64位版本。所以我只把我的项目设置为32位。其他一些本机库可能根本不支持64位,特别是如果它们是封闭源代码的遗留组件。


正如codeinchaos所说,这是一个图书馆的问题。在x64下,不能使用x86库。在x86下,可以运行x64库。
Any cpu表示它将使用您当前的平台设置(运行CPU)。

如果您想了解更多关于它的详细信息,请阅读以下内容:http://visualstudiohacks.com/articles/……