On Jan 29, 2015, at 3:33 AM, Alex J Lennon <[email protected]>
wrote:
> Can anybody advise if this is an implementational issue or if I'm doing
> something wrong here?
You're doing something wrong, *and* there's an implementation issue.
Module GetPEKind() returns information about the specified module, which can
have absolutely no bearing on the actual runtime environment.
The C# compiler has a /platform:PLATFORM flag to specify the target platform:
mcs /platform:x86 myapp.cs
This sets a flag in the PE header, and Module.GetPEKind() extracts this
information. For example, build with /platform:arm, and Module.GetPEKind() will
return ImageFileMachine.ARM *for that assembly*.
.NET checks this PE header value during process startup. For example, if you
compile with /platform:anycpu, your app may run as a 32-bit process on 32-bit
windows, and as a 64-bit process on 64-bit windows. If you need to run as a
32-bit process on 64-bit windows (e.g. because a dependent .dll you use is only
32-bit), then you must build your app with /platform:x86 to force .NET to run
your app as a 32-bit process on 64-bit windows.
Mono ignores this PE header value. In the case of 32-bit vs. 64-bit processes,
you must use an appropriately built mono (e.g. mono32 for a 32-bit mono) in
order to get an appropriate bitness. (It's also entirely possible that there is
no option; at present on OS X, the Mono package only provides a 32-bit runtime,
though you can build a 64-bit runtime yourself.)
Offhand, short of using uname(3)/Mono.Unix.Native.Syscall.uname(), I'm not sure
of a good way to determine the processor architecture.
- Jon
_______________________________________________
Mono-list maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list