By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
425,677 Members | 1,890 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 425,677 IT Pros & Developers. It's quick & easy.

How do I: Dynamically embed resource files (specifically, XML) (...)

P: n/a
Hi, All. I am creating a setup program. The way it works is that the
user creates their setup info, my program generates the C# code for a
setup executable, embeds the xml file containing the info for the
setup, and compiles the whole thing into one EXE. How do i embed
resources, and access them, into that assembly?

Dec 30 '06 #1
Share this Question
Share on Google+
8 Replies


P: n/a
Hi,

When you compile the assembly with the C# compiler use a /resource switch
for each resource that you want to embed:

C# Language Reference
/resource (Embed Resource File to Output) (C# Compiler Options)
http://msdn2.microsoft.com/en-us/lib...07(VS.80).aspx

You can use the resgen tool to create binary resources from an xml resource
file (.resx) that you can supply to the C# compiler:

..NET Framework Tools
Resource File Generator (Resgen.exe)
http://msdn2.microsoft.com/en-us/lib...z1(VS.80).aspx

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@s34g2000cwa.googlegr oups.com...
Hi, All. I am creating a setup program. The way it works is that the
user creates their setup info, my program generates the C# code for a
setup executable, embeds the xml file containing the info for the
setup, and compiles the whole thing into one EXE. How do i embed
resources, and access them, into that assembly?

Dec 31 '06 #2

P: n/a
Thank you for your reply. It is much appreciated. So, how would I do
this programatically, usang an ICodeCompiler or similar class? How
would I use a simple (ie, serialized) XML file?

Thanks again!

Dave Sexton wrote:
Hi,

When you compile the assembly with the C# compiler use a /resource switch
for each resource that you want to embed:

C# Language Reference
/resource (Embed Resource File to Output) (C# Compiler Options)
http://msdn2.microsoft.com/en-us/lib...07(VS.80).aspx

You can use the resgen tool to create binary resources from an xml resource
file (.resx) that you can supply to the C# compiler:

.NET Framework Tools
Resource File Generator (Resgen.exe)
http://msdn2.microsoft.com/en-us/lib...z1(VS.80).aspx

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@s34g2000cwa.googlegr oups.com...
Hi, All. I am creating a setup program. The way it works is that the
user creates their setup info, my program generates the C# code for a
setup executable, embeds the xml file containing the info for the
setup, and compiles the whole thing into one EXE. How do i embed
resources, and access them, into that assembly?
Dec 31 '06 #3

P: n/a
Hi,

The following link contains an example:

CompilerParameters.EmbeddedResources Property
http://msdn2.microsoft.com/en-us/lib...resources.aspx

To create the resource file you can write it to a temporary file on disk for
use with the CodeDOM:

..NET Framework Class Library
ResourceWriter Class
http://msdn2.microsoft.com/en-us/lib...er(VS.80).aspx

Here's an example that I've derived based on the links above (your
serialized xml can be a byte[] or string here):

string temp = Path.Combine(Path.GetTempPath(),
Path.GetTempFileName());

try
{
using (FileStream stream = new FileStream(temp))
// Unfortunately, the EmbeddedResources property is a
// StringCollection and accepts only file paths, not resource
// streams, so MemoryStream can't be used here
{
using (ResourceWriter writer = new ResourceWriter(stream))
{
// your xml can be byte[] or a string
writer.AddResource("name", yourXml);
writer.AddResource("name2", yourXml2);
}
}

CompilerParameters cp = new CompilerParameters();

// provider is an instance of CodeDomProvider
if (provider.Supports(GeneratorSupport.Resources))
{
cp.EmbeddedResources.Add(temp);
}
...
CompilerResults cr =
provider.CompileAssemblyFromFile(cp, sourceFile);
...
}
finally
{
File.Delete(temp);
}
I haven't tested the code myself so beware :)

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@k21g2000cwa.googlegr oups.com...
Thank you for your reply. It is much appreciated. So, how would I do
this programatically, usang an ICodeCompiler or similar class? How
would I use a simple (ie, serialized) XML file?

Thanks again!

Dave Sexton wrote:
>Hi,

When you compile the assembly with the C# compiler use a /resource switch
for each resource that you want to embed:

C# Language Reference
/resource (Embed Resource File to Output) (C# Compiler Options)
http://msdn2.microsoft.com/en-us/lib...07(VS.80).aspx

You can use the resgen tool to create binary resources from an xml
resource
file (.resx) that you can supply to the C# compiler:

.NET Framework Tools
Resource File Generator (Resgen.exe)
http://msdn2.microsoft.com/en-us/lib...z1(VS.80).aspx

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@s34g2000cwa.googleg roups.com...
Hi, All. I am creating a setup program. The way it works is that the
user creates their setup info, my program generates the C# code for a
setup executable, embeds the xml file containing the info for the
setup, and compiles the whole thing into one EXE. How do i embed
resources, and access them, into that assembly?

Dec 31 '06 #4

P: n/a
Thank you! I do have a question: can EmbeddedResources contain binary
data, like for self-extraction, or text data, like for an html page?
Your links above really answered my question :) I appreciate your
reply!

Dave Sexton wrote:
Hi,

The following link contains an example:

CompilerParameters.EmbeddedResources Property
http://msdn2.microsoft.com/en-us/lib...resources.aspx

To create the resource file you can write it to a temporary file on disk for
use with the CodeDOM:

.NET Framework Class Library
ResourceWriter Class
http://msdn2.microsoft.com/en-us/lib...er(VS.80).aspx

Here's an example that I've derived based on the links above (your
serialized xml can be a byte[] or string here):

string temp = Path.Combine(Path.GetTempPath(),
Path.GetTempFileName());

try
{
using (FileStream stream = new FileStream(temp))
// Unfortunately, the EmbeddedResources property is a
// StringCollection and accepts only file paths, not resource
// streams, so MemoryStream can't be used here
{
using (ResourceWriter writer = new ResourceWriter(stream))
{
// your xml can be byte[] or a string
writer.AddResource("name", yourXml);
writer.AddResource("name2", yourXml2);
}
}

CompilerParameters cp = new CompilerParameters();

// provider is an instance of CodeDomProvider
if (provider.Supports(GeneratorSupport.Resources))
{
cp.EmbeddedResources.Add(temp);
}
...
CompilerResults cr =
provider.CompileAssemblyFromFile(cp, sourceFile);
...
}
finally
{
File.Delete(temp);
}
I haven't tested the code myself so beware :)

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@k21g2000cwa.googlegr oups.com...
Thank you for your reply. It is much appreciated. So, how would I do
this programatically, usang an ICodeCompiler or similar class? How
would I use a simple (ie, serialized) XML file?

Thanks again!

Dave Sexton wrote:
Hi,

When you compile the assembly with the C# compiler use a /resource switch
for each resource that you want to embed:

C# Language Reference
/resource (Embed Resource File to Output) (C# Compiler Options)
http://msdn2.microsoft.com/en-us/lib...07(VS.80).aspx

You can use the resgen tool to create binary resources from an xml
resource
file (.resx) that you can supply to the C# compiler:

.NET Framework Tools
Resource File Generator (Resgen.exe)
http://msdn2.microsoft.com/en-us/lib...z1(VS.80).aspx

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@s34g2000cwa.googlegr oups.com...
Hi, All. I am creating a setup program. The way it works is that the
user creates their setup info, my program generates the C# code for a
setup executable, embeds the xml file containing the info for the
setup, and compiles the whole thing into one EXE. How do i embed
resources, and access them, into that assembly?
Dec 31 '06 #5

P: n/a
Hi,

It can be any format that you want. Use the
System.Resources.ResourceManager to load the resource later. e.g., Use the
GetStream method for binary or GetString method for a string resource.

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@42g2000cwt.googlegro ups.com...
Thank you! I do have a question: can EmbeddedResources contain binary
data, like for self-extraction, or text data, like for an html page?
Your links above really answered my question :) I appreciate your
reply!

Dave Sexton wrote:
>Hi,

The following link contains an example:

CompilerParameters.EmbeddedResources Property
http://msdn2.microsoft.com/en-us/lib...resources.aspx

To create the resource file you can write it to a temporary file on disk
for
use with the CodeDOM:

.NET Framework Class Library
ResourceWriter Class
http://msdn2.microsoft.com/en-us/lib...er(VS.80).aspx

Here's an example that I've derived based on the links above (your
serialized xml can be a byte[] or string here):

string temp = Path.Combine(Path.GetTempPath(),
Path.GetTempFileName());

try
{
using (FileStream stream = new FileStream(temp))
// Unfortunately, the EmbeddedResources property is a
// StringCollection and accepts only file paths, not resource
// streams, so MemoryStream can't be used here
{
using (ResourceWriter writer = new ResourceWriter(stream))
{
// your xml can be byte[] or a string
writer.AddResource("name", yourXml);
writer.AddResource("name2", yourXml2);
}
}

CompilerParameters cp = new CompilerParameters();

// provider is an instance of CodeDomProvider
if (provider.Supports(GeneratorSupport.Resources))
{
cp.EmbeddedResources.Add(temp);
}
...
CompilerResults cr =
provider.CompileAssemblyFromFile(cp, sourceFile);
...
}
finally
{
File.Delete(temp);
}
I haven't tested the code myself so beware :)

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@k21g2000cwa.googleg roups.com...
Thank you for your reply. It is much appreciated. So, how would I do
this programatically, usang an ICodeCompiler or similar class? How
would I use a simple (ie, serialized) XML file?

Thanks again!

Dave Sexton wrote:
Hi,

When you compile the assembly with the C# compiler use a /resource
switch
for each resource that you want to embed:

C# Language Reference
/resource (Embed Resource File to Output) (C# Compiler Options)
http://msdn2.microsoft.com/en-us/lib...07(VS.80).aspx

You can use the resgen tool to create binary resources from an xml
resource
file (.resx) that you can supply to the C# compiler:

.NET Framework Tools
Resource File Generator (Resgen.exe)
http://msdn2.microsoft.com/en-us/lib...z1(VS.80).aspx

--
Dave Sexton
http://davesexton.com/blog

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@s34g2000cwa.googleg roups.com...
Hi, All. I am creating a setup program. The way it works is that the
user creates their setup info, my program generates the C# code for
a
setup executable, embeds the xml file containing the info for the
setup, and compiles the whole thing into one EXE. How do i embed
resources, and access them, into that assembly?


Jan 1 '07 #6

P: n/a
Okay! Thanks! That answers my question completely :).

Jan 1 '07 #7

P: n/a
How are you compiling the generated source code? Are you calling csc or
using the CSharpCodeProvider class? In the former case, you should specify
the /resource: option [2], in the latter, specify embedded resources with
the EmbeddedResouces [1] property of the CompilerParameters instance you are
using when creating the code provider.

[1]
http://msdn2.microsoft.com/en-us/lib...resources.aspx
[2]
http://msdn.microsoft.com/library/en...mpiler_topic12

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@s34g2000cwa.googlegr oups.com...
Hi, All. I am creating a setup program. The way it works is that the
user creates their setup info, my program generates the C# code for a
setup executable, embeds the xml file containing the info for the
setup, and compiles the whole thing into one EXE. How do i embed
resources, and access them, into that assembly?

Jan 1 '07 #8

P: n/a
I believe I am going with the latter, so the library handling the
dynamic generation can easily be deployed to PCs without direct access
to the csc. Thank You!

Lebesgue wrote:
How are you compiling the generated source code? Are you calling csc or
using the CSharpCodeProvider class? In the former case, you should specify
the /resource: option [2], in the latter, specify embedded resources with
the EmbeddedResouces [1] property of the CompilerParameters instance you are
using when creating the code provider.

[1]
http://msdn2.microsoft.com/en-us/lib...resources.aspx
[2]
http://msdn.microsoft.com/library/en...mpiler_topic12

"CodeLeon" <le*******@gmail.comwrote in message
news:11**********************@s34g2000cwa.googlegr oups.com...
Hi, All. I am creating a setup program. The way it works is that the
user creates their setup info, my program generates the C# code for a
setup executable, embeds the xml file containing the info for the
setup, and compiles the whole thing into one EXE. How do i embed
resources, and access them, into that assembly?
Jan 1 '07 #9

This discussion thread is closed

Replies have been disabled for this discussion.