I wanted to distribute the desktop client I made for https://cryptabyte.com/ as a single .exe, without any install or additional DLL’s. I used ILMerge, a tool from Microsoft Research to merge all the assemblies into one DLL. (If you have the .Net 4.5 beta installed like me, read this to target .Net 4.0.) I merged the assemblies with ILMerge:
ILMerge.exe /target:CryptAByte /out:Crypt.exe /targetplatform:"v4,C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.0" CryptAByte.exe CryptAByte.CryptoLibrary.dll CryptAByte.Domain.dll Ionic.Zip.dll
ILMerge has the added benefit of making the merged DLL slightly smaller that than the sum of its parts.
I wanted my app to run on OS X too. After I stripped out the Entity Framework Code First data annotations from my data structures, it compiled and ran smoothly on OS X:
Actually, that doesn’t look very good at all. The Mono WinForms color scheme has some kind of sickly yellow tinge to it. I want to distribute this without requiring Mono to be installed, so I used macpack:
macpack -m:2 -o:. -r:/Library/Frameworks/Mono.framework/Versions/Current/lib/ CryptAByte.Domain.dll CryptAByte.CryptoLibrary.dll Ionic.Zip.dll -n:CryptAByte -a:CryptAByte.exe
The resulting .app was over 300MB! Looks like I’m going to have to write a native client for OS X.
If you want to save yourself some of the effort of a full rewrite, consider replacing Windows.Forms with a MonoMac UI:
http://www.mono-project.com/MonoMac
This will give you the native look and feel that Mono’s Windows.Forms implementation doesn’t provide. Also, you should definitely be able to reduce the size of your app bundle to far less than 300MB:
http://www.mono-project.com/MonoMacPackager