|
|||||||||||||||||||||||
|
|||||||||||||||||||||||
|
Announcements
Want a new Job?
Chapters
Services
Feature Zones
|
Note: This is an unedited contribution. If this article is inappropriate,
needs attention or copies someone else's work without reference then please
Report This Article
ContentsIntroductionThis article shows how to compile a bat file into an executable file. The compiled executable can run without showing a windows and you can pass command line parameters to it as you would pass them to the bat file. How the program worksThe way this program compiles bat file is quite tricky and weird so I call
this program a "Mock compiler". Bat file is not even parsed. This program creates another program and adds
the specified bat file as an embedded file in that program. When the generated
program is executed, it extracts the embedded bat file to a temp folder and runs
it using the Using the codeIn order to create another program from your application you will need to
create instance of using (CSharpCodeProvider code=new CSharpCodeProvider()) { CompilerParameters compar = new CompilerParameters(); string option = "/target:winexe"; // Set the icon for executable if (Properties.Settings.Default.Customicon && File.Exists(Properties.Settings.Default.iconpath)) { option += " " + "/win32icon:" + "\"" + Properties.Settings.Default.iconpath + "\""; } compar.CompilerOptions = option; compar.GenerateExecutable = true; compar.IncludeDebugInformation = false; //Add the bat file as an embedded resource if (File.Exists(filepath)) { compar.EmbeddedResources.Add(filepath); } compar.OutputAssembly = path; compar.GenerateInMemory = false; //Add references compar.ReferencedAssemblies.Add("System.dll"); compar.ReferencedAssemblies.Add("System.Data.dll"); compar.ReferencedAssemblies.Add("System.Deployment.dll"); compar.ReferencedAssemblies.Add("System.Drawing.dll"); compar.ReferencedAssemblies.Add("System.Windows.Forms.dll"); compar.ReferencedAssemblies.Add("System.Xml.dll"); compar.TreatWarningsAsErrors = false; //Compile it //The code is included in the executable as a resource CompilerResults res = code.CompileAssemblyFromSource(compar, Properties.Resources.Program); if (res.Errors.Count > 0) { result = false; } else result = true; } When you run the generated executable it will extract the bat file, process the command line arguments if any and run it. If specified the bat file will run without creating any window. Here is the code that shows how this is accomplished. //This code requires System.Reflection namespace //Extracts the bat file private void extract() { string name = Assembly.GetExecutingAssembly().GetManifestResourceNames()[0]; hide = name.EndsWith("hideit.bat"); Stream theResource = Assembly.GetExecutingAssembly().GetManifestResourceStream(name); BinaryReader br = new BinaryReader(theResource); FileStream fs = new FileStream(Environment.GetEnvironmentVariable("TEMP") + "\\it.bat", FileMode.Create); byte[] bt = new byte[theResource.Length]; theResource.Read(bt, 0, bt.Length); fs.Write(bt, 0, bt.Length); br.Close(); fs.Close(); } //Process command line arguments private string buildargument(string[] args) { StringBuilder arg = new StringBuilder(); for (int i = 0; i < args.Length; i++) { arg.Append(args[i] + " "); } return arg.ToString(); } //Start the process private void start(string[] args) { ProcessStartInfo info = new ProcessStartInfo(); info.FileName = Environment.GetEnvironmentVariable("TEMP") + "\\it.bat"; //Specify argument info.Arguments = buildargument(args); //Hide the window if specified info.CreateNoWindow = hide; if (hide) { info.WindowStyle = ProcessWindowStyle.Hidden; } //Set the working directory for the bat file. This is important as the //bat file might use relative path info.WorkingDirectory = Application.StartupPath; //At last start the process Process proc = new Process(); proc.StartInfo = info; proc.Start(); } Points of InterestThe way this program compiles bat files is quite tricky and a little bit strange. History17 June, 2007 - Initial release.
|
||||||||||||||||||||||