CSharpCodeProvider generated EXE embedded with ResourceWriter generated .resources fails...

J

Jon Rista

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.CurrentDomain.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.dll");
cparams.ReferencedAssemblies.Add("System.Windows.Forms.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.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
(e-mail address removed)
 
J

Jon Rista

Is there a better group I could ask this question in?

Jon Rista

Jon Rista said:
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.CurrentDomain.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.dll");
cparams.ReferencedAssemblies.Add("System.Windows.Forms.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.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
(e-mail address removed)
 
T

Tom Spink

Is there a better group I could ask this question in?

Jon Rista

Jon Rista said:
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.CurrentDomain.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.dll");
cparams.ReferencedAssemblies.Add("System.Windows.Forms.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.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
(e-mail address removed)


Hi Jon,

Have you checked that your paths are all correct? This is the only thing I
can think of, off the top of my head. The error, to me, states to "Make
sure "..." was correctly embedded or linked into assembly "...""

Have you made sure your paths are correct, and whatnot?
 
J

Jon Rista

Yeah, I'm pretty certain that the path to the .resources file is correct. I
am currently using the /resources option for csc though. Would linking the
resources be any different? I'm not sure whether VS.NET itself embeds or
links the resources when you compile there or not.

I'll mess with it some more and if I still have problems, I'll post.

Tom Spink said:
Is there a better group I could ask this question in?

Jon Rista

Jon Rista said:
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.CurrentDomain.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.dll");
cparams.ReferencedAssemblies.Add("System.Windows.Forms.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.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
(e-mail address removed)


Hi Jon,

Have you checked that your paths are all correct? This is the only thing
I
can think of, off the top of my head. The error, to me, states to "Make
sure "..." was correctly embedded or linked into assembly "...""

Have you made sure your paths are correct, and whatnot?
 
J

Jon Rista

Well, the resources are there. The output .exe is the same size when
compiled with VS.NET or my own program. I'm really stumped as to why this
won't work.

Jon Rista said:
Yeah, I'm pretty certain that the path to the .resources file is correct.
I am currently using the /resources option for csc though. Would linking
the resources be any different? I'm not sure whether VS.NET itself embeds
or links the resources when you compile there or not.

I'll mess with it some more and if I still have problems, I'll post.

Tom Spink said:
Is there a better group I could ask this question in?

Jon Rista

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.CurrentDomain.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.dll");
cparams.ReferencedAssemblies.Add("System.Windows.Forms.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.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
(e-mail address removed)


Hi Jon,

Have you checked that your paths are all correct? This is the only thing
I
can think of, off the top of my head. The error, to me, states to "Make
sure "..." was correctly embedded or linked into assembly "...""

Have you made sure your paths are correct, and whatnot?

 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top