Reduce .msi size

Jun 1 at 7:29 AM
We are working to reduce our installer size (setup.msi) but having some hard time.
Our .msi for one language is about 11MB and when compiling all languages to one msi it is about 96MB!!
We tried making the service and application of our SW not embedded in the .msi, but that reduced the size from 11MB to 10MB, which is totally not enough!
Our icon is pretty small (about 800KB), so I guess that's not the issue.
In addition,The package has the attribute: Compressed="yes". The Media has the following attributes: EmbedCab="yes" CompressionLevel="high" (in addition to the others).
Do you have any idea what can make our msi so big, or any idea where or how can we look to see what is the size of each component in our .msi?
Thanking you in advance
Jun 1 at 11:02 AM
I just figure out that my custom actions are the ones making the msi so large, any idea how to reduce the custom actions size?
Jun 4 at 12:16 PM
CodePlex is no longer the home of Wix#. Please use GitHub:

As for your question CA are always just DLLs. Either native or managed. If you want to reduce their size consider removing any business logic that is not related the deployment.

For example in case of managed CA a common cause for excessive size is to have the build script and CA merged into the same assembly. It is not a problem at all. In fact it is a default dependency model for managed CAs. However if you do a lot of other things in your build script then consider splitting build script and CA assembly. See DTF_ExternalAssembly sample for that.

If your problem is with the native DLL then consider the optimizing your code for that DLL.
Jun 6 at 3:32 PM
I tried doing as you said but it didn't make a big difference.
I see now that in my .wxs file every CA creates it's own binary and than each CA calls it's own binary (see BinaryKey) like his:

<Binary Id="Action1" SourceFile="CustomAction.CA.dll" />
<Binary Id="Action2" SourceFile="CustomAction.CA.dll"  />
<Binary Id="Action3" SourceFile="CustomAction.CA.dll"  />
<Binary Id="Action4" SourceFile="CustomAction.CA.dll"  />
<Binary Id="Action5" SourceFile="CustomAction.CA.dll"  />
<Binary Id="Action6" SourceFile="CustomAction.CA.dll"  />
<Binary Id="Action7" SourceFile="%this%.CA.dll"  />
The same for all the CAs.

<CustomAction Id="Set_Action1" Property="Action1 " Value="APP_NAME=-------------;SERVICE_NAME=------------;INSTALLDIR=[INSTALLDIR];UILevel=[UILevel]" />
<CustomAction Id="Action1 " BinaryKey="Action1" DllEntry="????????" Impersonate="no" Execute="deferred" Return="check"  />
<CustomAction Id="Action2 " BinaryKey="Action2" DllEntry="?????????" Impersonate="no" Execute="rollback" Return="check"  />
<CustomAction Id="Action3 " BinaryKey="Action3" DllEntry="??????????" Impersonate="no" Execute="deferred" Return="check"  />

The same for all the CAs.

It seems like this is totally incorrect, do you have any idea how to change it? I mean that the dll should be called only once and not for every CA again and again, creating one binary for the dll