Consider a self-extracting ZIP file.
You can create one with DotNetZip . Requires .NET on the target machine. Unpacks files to the location specified by the user, and then, if necessary, launches the program you specified. This program may be one of the unzipped files, or it may be something else.
To create a self-extracting archive using DotNetZip, this is the code:
using (ZipFile zip1 = new ZipFile())
{
zip1.AddFile(filename1, "");
zip1.AddFile(filename2, "subdir");
zip1.AddFile(filename3, "subdir");
zip1.Comment = "This will be embedded into a self-extracting exe";
zip1.AddEntry("Readme.txt", "This is Update XXX of product YYY");
var sfxOptions = new SelfExtractorSaveOptions {
Flavor = SelfExtractorFlavor.WinFormsApplication,
Quiet = false,
DefaultExtractDirectory = UnpackDirectory
}
zip1.SaveSelfExtractor(SfxFileToCreate, sfxOptions);
}
The user interface of the generated SFX is as follows:

SFX MSI, . .