string GenerateOptions(DotNetProjectConfiguration configuration, VBCompilerParameters compilerparameters, VBProjectParameters projectparameters, string outputFileName)
        {
            DotNetProject project = (DotNetProject)configuration.ParentItem;
            StringBuilder sb      = new StringBuilder();

            sb.AppendFormat("\"-out:{0}\"", outputFileName);
            sb.AppendLine();

            sb.AppendLine("-nologo");
            sb.AppendLine("-utf8output");
            sb.AppendLine("-quiet");

            sb.AppendFormat("-debug:{0}", compilerparameters.DebugType);
            sb.AppendLine();

            if (compilerparameters.Optimize)
            {
                sb.AppendLine("-optimize+");
            }


            if (projectparameters.OptionStrict)
            {
                sb.AppendLine("-optionstrict+");
            }
            else
            {
                sb.AppendLine("-optionstrict-");
            }

            if (projectparameters.OptionExplicit)
            {
                sb.AppendLine("-optionexplicit+");
            }
            else
            {
                sb.AppendLine("-optionexplicit-");
            }

            if (projectparameters.BinaryOptionCompare)
            {
                sb.AppendLine("-optioncompare:binary");
            }
            else
            {
                sb.AppendLine("-optioncompare:text");
            }

            if (projectparameters.OptionInfer)
            {
                sb.AppendLine("-optioninfer+");
            }
            else
            {
                sb.AppendLine("-optioninfer-");
            }

            string mytype = projectparameters.MyType;

            if (!string.IsNullOrEmpty(mytype))
            {
                sb.AppendFormat("-define:_MYTYPE=\\\"{0}\\\"", mytype);
                sb.AppendLine();
            }

            string win32IconPath = projectparameters.ApplicationIcon;

            if (!string.IsNullOrEmpty(win32IconPath) && File.Exists(win32IconPath))
            {
                sb.AppendFormat("\"-win32icon:{0}\"", win32IconPath);
                sb.AppendLine();
            }

            if (!string.IsNullOrEmpty(projectparameters.CodePage))
            {
                TextEncoding enc = TextEncoding.GetEncoding(projectparameters.CodePage);
                sb.AppendFormat("-codepage:{0}", enc.CodePage);
                sb.AppendLine();
            }

            if (!string.IsNullOrEmpty(project.DefaultNamespace))
            {
                sb.AppendFormat("-rootnamespace:{0}", project.DefaultNamespace);
                sb.AppendLine();
            }

            if (!string.IsNullOrEmpty(compilerparameters.DefineConstants))
            {
                sb.AppendFormat("\"-define:{0}\"", compilerparameters.DefineConstants);
                sb.AppendLine();
            }

            if (compilerparameters.DefineDebug)
            {
                sb.AppendLine("-define:DEBUG=-1");
            }

            if (compilerparameters.DefineTrace)
            {
                sb.AppendLine("-define:TRACE=-1");
            }

            if (compilerparameters.WarningsDisabled)
            {
                sb.AppendLine("-nowarn");
            }
            else if (!string.IsNullOrEmpty(compilerparameters.NoWarn))
            {
                sb.AppendFormat("-nowarn:{0}", compilerparameters.NoWarn);
                sb.AppendLine();
            }

            if (!string.IsNullOrEmpty(compilerparameters.WarningsAsErrors))
            {
                sb.AppendFormat("-warnaserror+:{0}", compilerparameters.WarningsAsErrors);
                sb.AppendLine();
            }

            if (configuration.SignAssembly)
            {
                if (File.Exists(configuration.AssemblyKeyFile))
                {
                    sb.AppendFormat("\"-keyfile:{0}\"", configuration.AssemblyKeyFile);
                    sb.AppendLine();
                }
            }

            if (!string.IsNullOrEmpty(compilerparameters.DocumentationFile))
            {
                sb.AppendFormat("\"-doc:{0}\"", compilerparameters.DocumentationFile);
                sb.AppendLine();
            }

            if (!string.IsNullOrEmpty(projectparameters.StartupObject) && projectparameters.StartupObject != "Sub Main")
            {
                sb.Append("-main:");
                sb.Append(projectparameters.StartupObject);
                sb.AppendLine();
            }

            if (compilerparameters.RemoveIntegerChecks)
            {
                sb.AppendLine("-removeintchecks+");
            }

            if (!string.IsNullOrEmpty(compilerparameters.AdditionalParameters))
            {
                sb.Append(compilerparameters.AdditionalParameters);
                sb.AppendLine();
            }

            switch (configuration.CompileTarget)
            {
            case CompileTarget.Exe:
                sb.AppendLine("-target:exe");
                break;

            case CompileTarget.WinExe:
                sb.AppendLine("-target:winexe");
                break;

            case CompileTarget.Library:
                sb.AppendLine("-target:library");
                break;

            case CompileTarget.Module:
                sb.AppendLine("-target:module");
                break;

            default:
                throw new NotSupportedException("unknown compile target:" + configuration.CompileTarget);
            }

            return(sb.ToString());
        }
        public BuildResult Compile(ProjectItemCollection items, DotNetProjectConfiguration configuration, ConfigurationSelector configSelector, IProgressMonitor monitor)
        {
            VBCompilerParameters compilerparameters = (VBCompilerParameters)configuration.CompilationParameters;

            if (compilerparameters == null)
            {
                compilerparameters = new VBCompilerParameters();
            }

            VBProjectParameters projectparameters = (VBProjectParameters)configuration.ProjectParameters;

            if (projectparameters == null)
            {
                projectparameters = new VBProjectParameters();
            }

            string       exe = configuration.CompiledOutputName;
            string       responseFileName = Path.GetTempFileName();
            StreamWriter writer           = new StreamWriter(responseFileName);

            writer.WriteLine(GenerateOptions(configuration, compilerparameters, projectparameters, exe));

            // Write references
            foreach (ProjectReference lib in items.GetAll <ProjectReference> ())
            {
                foreach (string fileName in lib.GetReferencedFileNames(configSelector))
                {
                    writer.Write("\"-r:");
                    writer.Write(fileName);
                    writer.WriteLine("\"");
                }
            }

            // Write source files and embedded resources
            foreach (ProjectFile finfo in items.GetAll <ProjectFile> ())
            {
                if (finfo.Subtype != Subtype.Directory)
                {
                    switch (finfo.BuildAction)
                    {
                    case "Compile":
                        writer.WriteLine("\"" + finfo.Name + "\"");
                        break;

                    case "EmbeddedResource":
                        string fname = finfo.Name;
                        if (String.Compare(Path.GetExtension(fname), ".resx", true) == 0)
                        {
                            fname = Path.ChangeExtension(fname, ".resources");
                        }

                        writer.WriteLine("\"-resource:{0},{1}\"", fname, finfo.ResourceId);
                        break;

                    default:
                        continue;
                    }
                }
            }

            // Write source files and embedded resources
            foreach (Import import in items.GetAll <Import> ())
            {
                writer.WriteLine("-imports:{0}", import.Include);
            }

            TempFileCollection tf = new TempFileCollection();

            writer.Close();

            string output       = "";
            string compilerName = configuration.TargetRuntime.GetToolPath(configuration.TargetFramework, "vbc");

            if (compilerName == null)
            {
                BuildResult res = new BuildResult();
                res.AddError(string.Format("Visual Basict .NET compiler not found ({0})", configuration.TargetRuntime.DisplayName));
                return(res);
            }

            string outstr = String.Concat(compilerName, " @", responseFileName);


            string workingDir = ".";

            if (configuration.ParentItem != null)
            {
                workingDir = configuration.ParentItem.BaseDirectory;
            }
            int exitCode;

            var envVars = configuration.TargetRuntime.GetToolsExecutionEnvironment(configuration.TargetFramework);

            monitor.Log.WriteLine(Path.GetFileName(compilerName) + " " + string.Join(" ", File.ReadAllLines(responseFileName)));
            exitCode = DoCompilation(outstr, tf, workingDir, envVars, ref output);

            monitor.Log.WriteLine(output);
            BuildResult result = ParseOutput(tf, output);

            if (result.Errors.Count == 0 && exitCode != 0)
            {
                // Compilation failed, but no errors?
                // Show everything the compiler said.
                result.AddError(output);
            }

            FileService.DeleteFile(responseFileName);
            if (configuration.CompileTarget != CompileTarget.Library)
            {
                WriteManifestFile(exe);
            }
            return(result);
        }
		string GenerateOptions (DotNetProjectConfiguration configuration, VBCompilerParameters compilerparameters, VBProjectParameters projectparameters, string outputFileName)
		{
			DotNetProject project = (DotNetProject) configuration.ParentItem;
			StringBuilder sb = new StringBuilder ();
			
			sb.AppendFormat ("\"-out:{0}\"", outputFileName);
			sb.AppendLine ();
			
			sb.AppendLine ("-nologo");
			sb.AppendLine ("-utf8output");
			sb.AppendLine ("-quiet");

			sb.AppendFormat ("-debug:{0}", compilerparameters.DebugType);
			sb.AppendLine ();

			if (compilerparameters.Optimize)
				sb.AppendLine ("-optimize+");

			
			if (projectparameters.OptionStrict)
				sb.AppendLine ("-optionstrict+");
			else
				sb.AppendLine ("-optionstrict-");
			
			if (projectparameters.OptionExplicit)
				sb.AppendLine ("-optionexplicit+");
			else
				sb.AppendLine ("-optionexplicit-");

			if (projectparameters.BinaryOptionCompare)
				sb.AppendLine ("-optioncompare:binary");
			else
				sb.AppendLine ("-optioncompare:text");

			if (projectparameters.OptionInfer)
				sb.AppendLine ("-optioninfer+");
			else
				sb.AppendLine ("-optioninfer-");

			string mytype = projectparameters.MyType;
			if (!string.IsNullOrEmpty (mytype)) {
				sb.AppendFormat ("-define:_MYTYPE=\\\"{0}\\\"", mytype);
				sb.AppendLine ();
			}
			
			string win32IconPath = projectparameters.ApplicationIcon;
			if (!string.IsNullOrEmpty (win32IconPath) && File.Exists (win32IconPath)) {
				sb.AppendFormat ("\"-win32icon:{0}\"", win32IconPath);
				sb.AppendLine ();
			}

			if (!string.IsNullOrEmpty (projectparameters.CodePage)) {
				TextEncoding enc = TextEncoding.GetEncoding (projectparameters.CodePage);
				sb.AppendFormat ("-codepage:{0}", enc.CodePage);
				sb.AppendLine ();
			}
			
			if (!string.IsNullOrEmpty (project.DefaultNamespace)) {
				sb.AppendFormat ("-rootnamespace:{0}", project.DefaultNamespace);
				sb.AppendLine ();
			}
			
			if (!string.IsNullOrEmpty (compilerparameters.DefineConstants)) {
				sb.AppendFormat ("\"-define:{0}\"", compilerparameters.DefineConstants);
				sb.AppendLine ();
			}

			if (compilerparameters.DefineDebug)
				sb.AppendLine ("-define:DEBUG=-1");

			if (compilerparameters.DefineTrace)
				sb.AppendLine ("-define:TRACE=-1");

			if (compilerparameters.WarningsDisabled) {
				sb.AppendLine ("-nowarn");
			} else if (!string.IsNullOrEmpty (compilerparameters.NoWarn)) {
				sb.AppendFormat ("-nowarn:{0}", compilerparameters.NoWarn);
				sb.AppendLine ();
			}

			if (!string.IsNullOrEmpty (compilerparameters.WarningsAsErrors)) {
				sb.AppendFormat ("-warnaserror+:{0}", compilerparameters.WarningsAsErrors);
				sb.AppendLine ();
			}
			
			if (configuration.SignAssembly) {
				if (File.Exists (configuration.AssemblyKeyFile)) {
					sb.AppendFormat ("\"-keyfile:{0}\"", configuration.AssemblyKeyFile);
					sb.AppendLine ();
				}
			}
			
			if (configuration.DelaySign)
				sb.AppendLine ("-delaySign");

			if (!string.IsNullOrEmpty (compilerparameters.DocumentationFile)) {
				sb.AppendFormat ("\"-doc:{0}\"", compilerparameters.DocumentationFile);
				sb.AppendLine ();
			}

			if (!string.IsNullOrEmpty (projectparameters.StartupObject) && projectparameters.StartupObject != "Sub Main") {
				sb.Append ("-main:");
				sb.Append (projectparameters.StartupObject);
				sb.AppendLine ();
			}

			if (compilerparameters.RemoveIntegerChecks)
				sb.AppendLine ("-removeintchecks+");
			
			if (!string.IsNullOrEmpty (compilerparameters.AdditionalParameters)) {
				sb.Append (compilerparameters.AdditionalParameters);
				sb.AppendLine ();
			}
						
			switch (configuration.CompileTarget) {
				case CompileTarget.Exe:
					sb.AppendLine ("-target:exe");
					break;
				case CompileTarget.WinExe:
					sb.AppendLine ("-target:winexe");
					break;
				case CompileTarget.Library:
					sb.AppendLine ("-target:library");
					break;
				case CompileTarget.Module:
					sb.AppendLine ("-target:module");
					break;
				default:
					throw new NotSupportedException("unknown compile target:" + configuration.CompileTarget);
			}
			
			return sb.ToString();
		}
		public BuildResult Compile (ProjectItemCollection items, DotNetProjectConfiguration configuration, ConfigurationSelector configSelector, IProgressMonitor monitor)
		{
			VBCompilerParameters compilerparameters = (VBCompilerParameters) configuration.CompilationParameters;
			if (compilerparameters == null)
				compilerparameters = new VBCompilerParameters ();
			
			VBProjectParameters projectparameters = (VBProjectParameters) configuration.ProjectParameters;
			if (projectparameters == null)
				projectparameters = new VBProjectParameters ();
			
			string exe = configuration.CompiledOutputName;
			string responseFileName = Path.GetTempFileName();
			StreamWriter writer = new StreamWriter (responseFileName);
			
			writer.WriteLine (GenerateOptions (configuration, compilerparameters, projectparameters, exe));

			// Write references
			foreach (ProjectReference lib in items.GetAll<ProjectReference> ()) {
				foreach (string fileName in lib.GetReferencedFileNames (configSelector)) {
					writer.Write ("\"-r:");
					writer.Write (fileName);
					writer.WriteLine ("\"");
				}
			}
			
			// Write source files and embedded resources
			foreach (ProjectFile finfo in items.GetAll<ProjectFile> ()) {
				if (finfo.Subtype != Subtype.Directory) {
					switch (finfo.BuildAction) {
						case "Compile":
							writer.WriteLine("\"" + finfo.Name + "\"");
						break;
						
						case "EmbeddedResource":
							string fname = finfo.Name;
							if (String.Compare (Path.GetExtension (fname), ".resx", true) == 0)
								fname = Path.ChangeExtension (fname, ".resources");

							writer.WriteLine("\"-resource:{0},{1}\"", fname, finfo.ResourceId);
							break;
						
						default:
							continue;
					}
				}
			}
			
			// Write source files and embedded resources
			foreach (Import import in items.GetAll<Import> ()) {
				writer.WriteLine ("-imports:{0}", import.Include);
			}
			
			TempFileCollection tf = new TempFileCollection ();
			writer.Close();
			
			string output = "";
			string compilerName = configuration.TargetRuntime.GetToolPath (configuration.TargetFramework, "vbc");
			if (compilerName == null) {
				BuildResult res = new BuildResult ();
				res.AddError (string.Format ("Visual Basic .NET compiler not found ({0})", configuration.TargetRuntime.DisplayName));
				return res;
			}
			
			string workingDir = ".";
			if (configuration.ParentItem != null)
				workingDir = configuration.ParentItem.BaseDirectory;
			int exitCode;
			
			var envVars = configuration.TargetRuntime.GetToolsExecutionEnvironment (configuration.TargetFramework);
			
			monitor.Log.WriteLine (Path.GetFileName (compilerName) + " " + string.Join (" ", File.ReadAllLines (responseFileName)));
			exitCode = DoCompilation (compilerName, responseFileName, tf, workingDir, envVars, ref output);
			
			monitor.Log.WriteLine (output);			                                                          
			BuildResult result = ParseOutput (tf, output);
			if (result.Errors.Count == 0 && exitCode != 0) {
				// Compilation failed, but no errors?
				// Show everything the compiler said.
				result.AddError (output);
			}
			
			FileService.DeleteFile (responseFileName);
			if (configuration.CompileTarget != CompileTarget.Library) {
				WriteManifestFile (exe);
			}
			return result;
		}
        public ProjectOptionsPanelWidget(MonoDevelop.Projects.Project project)
        {
            Gtk.ListStore        store;
            Gtk.CellRendererText cr;

            this.Build();

            this.project = (DotNetProject)project;
            parameters   = (VBProjectParameters)this.project.LanguageParameters;

            cr    = new Gtk.CellRendererText();
            store = new Gtk.ListStore(typeof(string));
            store.AppendValues(GettextCatalog.GetString("Executable"));
            store.AppendValues(GettextCatalog.GetString("Library"));
            store.AppendValues(GettextCatalog.GetString("Executable with GUI"));
            store.AppendValues(GettextCatalog.GetString("Module"));
            compileTargetCombo.Model = store;
            compileTargetCombo.PackStart(cr, true);
            compileTargetCombo.AddAttribute(cr, "text", 0);
            compileTargetCombo.Active   = (int)this.project.CompileTarget;
            compileTargetCombo.Changed += delegate(object sender, EventArgs e)
            {
                entryMainClass.Sensitive = compileTargetCombo.Active != (int)CompileTarget.Library && compileTargetCombo.Active != (int)CompileTarget.Module;
            };

            store = new Gtk.ListStore(typeof(string));
            store.AppendValues("WindowsForms");
            store.AppendValues("Windows");
            store.AppendValues("Console");
            txtMyType.Model      = store;
            txtMyType.TextColumn = 0;
            switch (parameters.MyType)
            {
            case "WindowsForms":
                txtMyType.Active = 0;
                break;

            case "Windows":
                txtMyType.Active = 1;
                break;

            case "Console":
                txtMyType.Active = 2;
                break;

            case null:
            case "":
                break;

            default:
                txtMyType.AppendText(parameters.MyType);
                txtMyType.Active = 3;
                break;
            }

            cr    = new Gtk.CellRendererText();
            store = new Gtk.ListStore(typeof(string));
            store.AppendValues("Binary");
            store.AppendValues("Text");
            cmbOptionCompare.Model = store;
            cmbOptionCompare.PackStart(cr, true);
            cmbOptionCompare.AddAttribute(cr, "text", 0);
            cmbOptionCompare.Active = parameters.BinaryOptionCompare ? 0 : 1;

            cr    = new Gtk.CellRendererText();
            store = new Gtk.ListStore(typeof(string));
            store.AppendValues("On");
            store.AppendValues("Off");
            cmbOptionExplicit.Model = store;
            cmbOptionExplicit.PackStart(cr, true);
            cmbOptionExplicit.AddAttribute(cr, "text", 0);
            cmbOptionExplicit.Active = parameters.OptionExplicit ? 0 : 1;

            cr    = new Gtk.CellRendererText();
            store = new Gtk.ListStore(typeof(string));
            store.AppendValues("On");
            store.AppendValues("Off");
            cmbOptionInfer.Model = store;
            cmbOptionInfer.PackStart(cr, true);
            cmbOptionInfer.AddAttribute(cr, "text", 0);
            cmbOptionInfer.Active = parameters.OptionInfer ? 0 : 1;

            cr    = new Gtk.CellRendererText();
            store = new Gtk.ListStore(typeof(string));
            store.AppendValues("On");
            store.AppendValues("Off");
            cmbOptionStrict.Model = store;
            cmbOptionStrict.PackStart(cr, true);
            cmbOptionStrict.AddAttribute(cr, "text", 0);
            cmbOptionStrict.Active = parameters.OptionStrict ? 0 : 1;

            // Codepage
            string foundEncoding   = null;
            string currentCodepage = parameters.CodePage;

            foreach (TextEncoding e in TextEncoding.SupportedEncodings)
            {
                if (e.CodePage == -1)
                {
                    continue;
                }
                if (e.Id == currentCodepage)
                {
                    foundEncoding = e.Id;
                }
                cmbCodePage.AppendText(e.Id);
            }
            if (foundEncoding != null)
            {
                cmbCodePage.Entry.Text = foundEncoding;
            }
            else if (!string.IsNullOrEmpty(currentCodepage))
            {
                cmbCodePage.Entry.Text = currentCodepage;
            }

            entryMainClass.Entry.Text = parameters.StartupObject;
            iconEntry.Path            = parameters.ApplicationIcon;
        }
		public ProjectOptionsPanelWidget (MonoDevelop.Projects.Project project)
		{
			Gtk.ListStore store;
			Gtk.CellRendererText cr;

			this.Build();

			this.project = (DotNetProject) project;
			parameters = (VBProjectParameters) this.project.LanguageParameters;
			
			cr = new Gtk.CellRendererText ();
			store = new Gtk.ListStore (typeof (string));
			store.AppendValues (GettextCatalog.GetString ("Executable"));
			store.AppendValues (GettextCatalog.GetString ("Library"));
			store.AppendValues (GettextCatalog.GetString ("Executable with GUI"));
			store.AppendValues (GettextCatalog.GetString ("Module")); 
			compileTargetCombo.Model = store;
			compileTargetCombo.PackStart (cr, true);
			compileTargetCombo.AddAttribute (cr, "text", 0);
			compileTargetCombo.Active = (int) this.project.CompileTarget;
			compileTargetCombo.Changed += delegate(object sender, EventArgs e) {
				entryMainClass.Sensitive = compileTargetCombo.Active != (int) CompileTarget.Library	&& compileTargetCombo.Active != (int) CompileTarget.Module;
			};

			store = new Gtk.ListStore (typeof (string));
			store.AppendValues ("WindowsForms");
			store.AppendValues ("Windows");
			store.AppendValues ("Console");
			txtMyType.Model = store;
			txtMyType.TextColumn = 0;
			switch (parameters.MyType) {
			case "WindowsForms":
				txtMyType.Active = 0;
				break;
			case "Windows":
				txtMyType.Active = 1;
				break;
			case "Console":
				txtMyType.Active = 2;
				break;
			case null:
			case "":
				break;
			default:
				txtMyType.AppendText (parameters.MyType);
				txtMyType.Active = 3;
				break;
			}

			cr = new Gtk.CellRendererText ();
			store = new Gtk.ListStore (typeof (string));
			store.AppendValues ("Binary");
			store.AppendValues ("Text");
			cmbOptionCompare.Model = store;
			cmbOptionCompare.PackStart (cr, true);
			cmbOptionCompare.AddAttribute (cr, "text", 0);
			cmbOptionCompare.Active = parameters.BinaryOptionCompare ? 0 : 1;
				
			cr = new Gtk.CellRendererText ();
			store = new Gtk.ListStore (typeof (string));
			store.AppendValues ("On");
			store.AppendValues ("Off");
			cmbOptionExplicit.Model = store;
			cmbOptionExplicit.PackStart (cr, true);
			cmbOptionExplicit.AddAttribute (cr, "text", 0);
			cmbOptionExplicit.Active = parameters.OptionExplicit ? 0 : 1;
			
			cr = new Gtk.CellRendererText ();
			store = new Gtk.ListStore (typeof (string));
			store.AppendValues ("On");
			store.AppendValues ("Off");
			cmbOptionInfer.Model = store;
			cmbOptionInfer.PackStart (cr, true);
			cmbOptionInfer.AddAttribute (cr, "text", 0);
			cmbOptionInfer.Active = parameters.OptionInfer ? 0 : 1;
			
			cr = new Gtk.CellRendererText ();
			store = new Gtk.ListStore (typeof (string));
			store.AppendValues ("On");
			store.AppendValues ("Off");
			cmbOptionStrict.Model = store;
			cmbOptionStrict.PackStart (cr, true);
			cmbOptionStrict.AddAttribute (cr, "text", 0);
			cmbOptionStrict.Active = parameters.OptionStrict ? 0 : 1;

			// Codepage
			string foundEncoding = null;
			string currentCodepage = parameters.CodePage;
			foreach (TextEncoding e in TextEncoding.SupportedEncodings) {
				if (e.CodePage == -1)
					continue;
				if (e.Id == currentCodepage)
					foundEncoding = e.Id;
				cmbCodePage.AppendText (e.Id);
			}
			if (foundEncoding != null)
				cmbCodePage.Entry.Text = foundEncoding;
			else if (!string.IsNullOrEmpty (currentCodepage))
				cmbCodePage.Entry.Text = currentCodepage;
			
			entryMainClass.Entry.Text = parameters.StartupObject;
			iconEntry.Path = parameters.ApplicationIcon;
		}