Contents
In this article, you will learn how to convert an MP3 file to an executable file.
- How to compile C# code during runtime
- How to play an MP3 file using C#
- How to insert a file into your application as an embedded resource and extract embedded resource dynamically during runtime
- How to implement dragging files from Explorer
- How to insert a file into your application as an embedded resource through designer.
Here is a description how this program works.
First the user chooses the MP3 files he wished to convert to EXE. After that, an instance of CompilerParameters
class is created and the specified MP3 file is added as an embedded resource through the EmbeddedResources
property of CompilerParameters
class. This is done in a worker thread using BackGroundWorker
component. The icon of the executable file can be chosen by the user and command line option is used to specify it.
The source code we compile is source code of a simple application that doesn't have a window, extracts the embedded MP3 file and plays that file. The source file that is compiled is itself embedded in the first application and extracted to temp folder at startup.
Microsoft.CSharp.CSharpCodeProvider pr
= new Microsoft.CSharp.CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
string pathtoicon="";
if (File.Exists(Application.StartupPath + "\\icon.ico"))
{
pathtoicon= Application.StartupPath + "\\icon.ico";
}
if (skinRadioButton2.Checked)
{
pathtoicon = this.pictureBox1.ImageLocation;
}
cp.CompilerOptions = "/target:winexe" + " " + "/win32icon:" + "\"" +
pathtoicon + "\"";
cp.GenerateExecutable = true;
cp.IncludeDebugInformation = false;
cp.EmbeddedResources.Add(this.textBox1.Text);
cp.OutputAssembly = sv.FileName;
cp.GenerateInMemory = false;
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Data.dll");
cp.ReferencedAssemblies.Add("System.Deployment.dll");
cp.ReferencedAssemblies.Add("System.Drawing.dll");
cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");
cp.ReferencedAssemblies.Add("System.Xml.dll");
cp.TreatWarningsAsErrors = false;
string temp = Environment.GetEnvironmentVariable("TEMP");
CompilerResults cr = pr.CompileAssemblyFromFile(cp, temp + "\\it.cs");
if (cr.Errors.Count>0)
{
MessageBox.Show("There was an error while converting the file","Error",
MessageBoxButtons.OK,MessageBoxIcon.Error);
}
This portion of code is from the source file that is compiled by the program. This code extracts embedded resource from the application during runtime.
string[] myassembly
= Assembly.GetExecutingAssembly().GetManifestResourceNames();
Stream theResource
= Assembly.GetExecutingAssembly().GetManifestResourceStream(myassembly[0]);
BinaryReader br = new BinaryReader(theResource);
FileStream fs = new FileStream(Environment.GetEnvironmentVariable("TEMP") +
+"\\it.mp3" , FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
byte[] bt = new byte[theResource.Length];
theResource.Read(bt,0, bt.Length);
bw.Write(bt);
br.Close();
bw.Close();
We pass myassambly[0]
to GetManifestResourceStream
because there is only one resource.
To implement drag and drop functionality from Windows Explorer, I use the class that came with the source code of this book.
You need to create an instance of the DragAndDropFileComponent
class and set up event handler. Here is the code snippet:
DragAndDropFileComponent drag = new DragAndDropFileComponent(this.components);
drag.BeginInit();
drag.FileDropped += new FileDroppedEventHandler(drag_FileDropped);
drag.HostingForm = this;
drag.EndInit();
Here is the event handler:
void drag_FileDropped(object sender, FileDroppedEventArgs e)
{
if (e.Filenames!=null &
e.Filenames.Length!=0 & e.Filenames[0].EndsWith(".mp3"))
{
this.textBox1.Text = e.Filenames[0];
}
}
In order to play an MP3 file from my application, I used this class. After you add MP3Player
to your project, playing MP3 files is very simple. Here is the code snippet from the source file that is compiled:
MP3Player pl = new MP3Player();
try
{
pl.Open(Environment.GetEnvironmentVariable("TEMP") + "\\it.mp3");
pl.Play();
System.Threading.Thread.Sleep(((int)pl.AudioLength)+1);
Application.Exit();
}
catch (Exception ex)
{ }
The program starts playing the MP3 file when it is loaded and quits when playing is over.
The idea itself of converting an MP3 file to an EXE file is a little bit strange and the whole application is interesting.
- 18th May, 2007 - Initial version
- 26th May, 2007 - Fixed the bug that was causing 100% CPU load when launching the generated EXE