I have a project where I need to create a windows .exe by compiling code and
linking in some resources. This program thats being generated is somewhat
unconventional, and I'll explain how. I'm generating a very simple installer
app that embeds referenced .dll files inside it, which are extracted and
referenced when the installer app is executed. This works great when the
installer app is built with Visual Studio .NET, but it does not work when I
compile it myself using a CSharpCodeProvider. The resources are written to a
..resource file using a ResourceWriter just prior to compilation of the .exe.
I add a custom compiler option to embed the resources. Code follows:
PopupProgress.Display("Compiling Installer...", null, "Compiling", "Creating
compiler...", 3, 1);
// Create code compiler
CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();
// Create compiler parameters
PopupProgress.Display("Compiling Installer...", null, "Compiling",
"Configuring compiler...", 3, 2);
CompilerParameters cparams = new CompilerParameters();
cparams.Evidence = new
System.Security.Policy.Evidence(AppDomain.CurrentD omain.Evidence);
cparams.GenerateExecutable = true;
cparams.GenerateInMemory = false;
cparams.IncludeDebugInformation = false;
//cparams.MainClass = "S2CIPInstaller.Main";
//cparams.OutputAssembly = step4.CompileTarget;
cparams.TempFiles = new TempFileCollection(m_basePath + @"temp\", true);
cparams.ReferencedAssemblies.Add("System.dll");
cparams.ReferencedAssemblies.Add("System.Drawing.d ll");
cparams.ReferencedAssemblies.Add("System.Windows.F orms.dll");
// cparams.ReferencedAssemblies.Add("System.XML.dll") ;
cparams.ReferencedAssemblies.Add(m_basePath +
@"temp\SynapticEffect.Collections.dll");
cparams.ReferencedAssemblies.Add(m_basePath + @"temp\DatGen.DBPF.dll");
cparams.CompilerOptions = "/resource:\"" + m_basePath +
"temp\\S2CIPInstaller.resources\"";
//cparams.Win32Resource = m_basePath + @"temp\S2CIPInstaller.resources";
// Compile
PopupProgress.Display("Compiling Installer...", null, "Compiling", "Please
wait...", 3, 3);
CompilerResults results = compiler.CompileAssemblyFromSource(cparams, code);
PopupProgress.Remove();
int errCount = 0;
for (int i=0; i<results.Errors.Count; i++)
{
if (!results.Errors[i].IsWarning)
errCount++;
}
if (errCount > 0)
{
MessageBox.Show(this, "There were errors during compilation. Installer not
created.");
}
else
{
MessageBox.Show(this, "Installer successfully created!");
}
When I use the code provider from my own program, I get the following error
(only visible after attaching with a debugger. I apologize for the coded
..exe name --> yodjgmq_.exe):
An unhandled exception of type
'System.Resources.MissingManifestResourceException ' occurred in mscorlib.dll
Additional information: Could not find any resources appropriate for the
specified culture (or the neutral culture) in the given assembly. Make sure
"S2CIPInstaller.resources" was correctly embedded or linked into assembly
"yodjgmq_".
baseName: S2CIPInstaller locationInfo: DatGen.S2CIPInstaller resource file
name: S2CIPInstaller.resources assembly: yodjgmq_, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null
Does anyone know why the installer app works when compiled with VS.NET, but
not with the CSharpCodeProvider and ResourceWriter classes from the .NET
Framework from my own code? Any insight is greatly appreciated.
Jon Rista
jr****@hotmail.com