What version of the CLR is used to load your app depends solely on the "Platform target" setting of the entry point assembly. If this is set to x86, it will always use the 32 bit runtime (and the assembly will fail to load on ia64 systems). If it is set to x64, it will always use the 64 bit runtime (and fail on x86 and ia64 systems). If it is set to Itanium, it will use the 64 bit runtime (and fail on x86 and x64). If it is set to "Any CPU" (the default), it will use the 32 bit runtime on x86 and the 64 bit runtime on x64 and ia64.
Now here's the crunch: if your assembly is marked as Any CPU and it references another assembly that is marked as x86, or it uses a 32 bit native DLL, what happens if it is executed on x64? Answer: the 64 bit runtime is used, and at the point the relevant assembly or DLL is loaded it will crash with a BadImageFormatException.
So if your application is using such an assembly or DLL, and you want people who have Windows x64 to be actually able to use it, please remember to set your Platform target to x86 in the project properties. An example of where this is a problem is any application that uses Managed DirectX or XNA; these libraries are x86 only, so any assembly marked as Any CPU that tries to load them will crash on x64. Also note that the C++/CLI compiler cannot produce assemblies marked with "Any CPU", even when using /clr:pure.
The value returned by IntPtr.Size does depend on the runtime used. Which is why I said, in my initial post, that if you use the Any CPU setting, you can use IntPtr.Size. Otherwise you can't.
If your app is being executed as a 32 bit process on a 64 bit system, GetNativeSystemInfo is the only way to get the real information (GetSystemInfo will pretend it's a 32 bit system). Note that GetNativeSystemInfo does not exist prior to Windows XP, so if you want to run on Windows 2000 don't call it without checking the system version first.