Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use #if to decide which platform is being compiled for in C#

In C++ there are predefined macros:

#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

Which allows me to set constants to control the amount of memory that will be used.

Of course I can define a preprocessor variable verbatim:

#define Is64bit 1

using System;
using System.Collections.Generic;

-later-

#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

I cannot find a way to detect the platform based on the values set in the configuration manager which would allow for command line building:

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"

Is there a way to detect this or will I have to build, change platform and build again?

Update: The 32/64 bit question became a moot point when the last of the 32bit Windows 7 workstations were retired so needing to compile for both platforms was no longer necessary. I think though it's worthwhile to retain this thread as the concepts can help with other preprocessor directives, targeting MS Office vs Open Office for example.

like image 319
Michael Stimson Avatar asked Jan 28 '15 02:01

Michael Stimson


2 Answers

You can add any constants you want to the .csproj file. These can be put into conditional property groups like the one below.

 <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <DefineConstants>TRACE;X64</DefineConstants>
    ...
 </PropertyGroup>

For my Release x64 build, I have defined a X64 constant that I can use like this:

#if X64

#endif
like image 193
John Koerner Avatar answered Oct 05 '22 21:10

John Koerner


In vb.net project is possible to use PLATFORM variable

#If PLATFORM == "x86" Then
   Imports MyProxy = MyX86dll.MyClass
#Else
   Imports MyProxy = MyX64dll.MyClass
#End If
like image 25
volody Avatar answered Oct 05 '22 20:10

volody