如何使用#if来决定在C#中编译哪个平台

在C ++中有预定义的宏:

#if defined(_M_X64) || defined(__amd64__) // Building for 64bit target const unsigned long MaxGulpSize = 1048576 * 128;// megabyte = 1048576; const unsigned long MaxRecsCopy = 1048576 * 16; #else const unsigned long MaxGulpSize = 1048576 * 8;// megabyte = 1048576; const unsigned long MaxRecsCopy = 1048576; #endif 

这允许我设置常量来控制将使用的内存量。

当然我可以逐字定义预处理器变量:

 #define Is64bit 1 using System; using System.Collections.Generic; 

-后来-

 #if Is64bit // Building for 64bit target const long MaxGulpSize = 1048576 * 128;// megabyte = 1048576; const long MaxRecsCopy = 1048576 * 16; #else const long MaxGulpSize = 1048576 * 8;// megabyte = 1048576; const long MaxRecsCopy = 1048576; #endif 

我找不到基于配置管理器中设置的值来检测平台的方法,这将允许命令行构建:

 set de=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe set sol=E:\Some\Path\to\my.sln "%de%" %sol% /build "Release|x86" "%de%" %sol% /build "Release|x64" 

有没有办法检测到这个或者我是否需要构建,更改平台并再次构建?

您可以将任何常量添加到.csproj文件中。 这些可以放入条件属性组,如下所示。

   TRACE;X64 ...  

对于我的Release x64版本,我已经定义了一个X64常量,我可以这样使用:

 #if X64 #endif 

确保您的设计考虑是否需要在编译时或运行时知道这一点。 如果是编译时间,那么是的,您可能需要定义一个常量。 这可以通过命令行传递,或者通过配置使用Visual Studio或MSBUILD传递。 更改配置并再次构建。

如果是运行时,请搜索问题的答案,例如如何以编程方式了解进程是32位还是64位 …以及朋友。

但是,根据应用程序的需要,这种区别也可能无关紧要。 .NET管理自己的内存,没有什么能阻止你的x86内置程序集在64位机器上运行。 如果您正在使用非托管代码,那么您的库中是否有任何外部可以告诉您应该使用的大小,而不是假设?

您还可以在x64平台的项目属性中定义符号(例如_x64)。 打开项目的属性对话框,选择x64平台,在Build页面上,只需将“_x64”放入“条件编译符号”框中。
确保为调试和发布配置执行此操作。