Now I can get an idea of what sequence of calls WiX actually expects to use to build an MSI.
If I compile this to Linux native code, and then run WiX under Mono, it loads this library and gets past the first CabExtract call, so I can find out what the next problem turns out to be.