[Mono-dev] My findings about PocketPC/Compact Framework apps.

Corwin Light-Williams mess at thethirdman.org
Tue Dec 6 17:35:22 EST 2005


I've perused the lists and bugzilla, and this topic comes up every  
now and then- sorry to rehash it.

I want to target .NET Compact Framework 2.0 on Windows Mobile 5,  
using mono as my compiler. If you simply compile an app using mcs/ 
gmcs on the command line, it doesn't work. Fine, I maybe expected  
that. So I decompiled it using Microsoft's ildasm- the output was  
fine. I then recompiled it using Microsoft's ilasm, and it worked! I  
deduced (as others have) that it must be in the PEFile part of the app.

So I compiled a version of Mono's ilasm, using GMCS and the 2.0 gac,  
and lo and behold, I can do the same thing I did with Microsoft's  
tools- disassemble and reassemble, and generate an app that runs on  
PocketPC. Except ilasm doesn't seem to link DLLs properly, or maybe  
my patched build was wrong- I could make an app that linked against  
system libraries work, but not an app that links against the .NETCF's  
System.Windows.Forms.dll. Damn.

So a little poking around reveals that gmcs and ilasm use two  
different PEFile writers- ilasm uses PEAPI.PEFile, whereas gmcs uses  
the C stuff, natively referenced through System.Reflection.Emit. Aha!

I then made 4 different EXE files, from the same source.

- One compiled using gmcs.
- One compiled using csc.
- One compiled using Microsoft ILASM to compile a decompiled EXE.
- One compiled using Mono ILASM to compile a decompiled EXE.

They all are slightly different- a byte here and there. But guess  
what gmcs had different that the latter three had all in common?  
Here's GMCS's text section:

IAT
CLI Header
-> ImportTables
-> EntryPoint
Bytecodes
Strings, Guid, Blob, etc
metadata
strongname

Here's what the other three have:

IAT
CLI Header
Bytecodes
Strings, Guid, Blob, etc
metadata
strongname
-> ImportTables
-> EntryPoint

So I patched reflection.c to place the ImportTables a little later,  
which still (to my surprise) generated an app that ran on Windows.  
When I took it to the PocketPC, sure enough, it ran without complaint  
or crash, although sadly it did nothing.

I feel like I'm close here, and I'm wondering if anyone has any  
comments or help.

Thanks for reading a long message!

Corwin



More information about the Mono-devel-list mailing list