2011-09-21 33 views
3

我正在编写一个程序,可以动态地创建小窗口窗体应用程序。 现在,exe文件生成正确。但是当我打开它时,显示2个窗口。使用WindowsForm和CSharpCodeProvider的问题

http://i.stack.imgur.com/pAFlg.png

所以,我应该怎么做才能禁用黑色窗口?

这里是我的代码:

string sourceName = "MyForm.cs"; 
FileInfo sourceFile = new FileInfo(sourceName); 
CSharpCodeProvider provider = new CSharpCodeProvider(); 

status_content_label.Text = "Exporting ... "; 

String exeName = String.Format(@"{0}\{1}.exe", "Output/", sourceFile.Name.Replace(".", "_")); 

CompilerParameters cp = new CompilerParameters(); 

cp.ReferencedAssemblies.Add("System.dll"); 
cp.ReferencedAssemblies.Add("System.Drawing.dll"); 
cp.ReferencedAssemblies.Add("System.Windows.Forms.dll"); 
//cp.ReferencedAssemblies.Add("AxInterop.ShockwaveFlashObjects.dll"); 
//cp.ReferencedAssemblies.Add("Interop.ShockwaveFlashObjects.dll"); 
//cp.ReferencedAssemblies.Add("System.Data.dll"); 

// Generate an executable instead of 
// a class library. 
cp.GenerateExecutable = true; 

// Specify the assembly file name to generate. 
cp.OutputAssembly = exeName; 

// Save the assembly as a physical file. 
cp.GenerateInMemory = false; 

cp.IncludeDebugInformation = false; 

// Set whether to treat all warnings as errors. 
cp.TreatWarningsAsErrors = false; 

cp.CompilerOptions = "/optimize /win32icon:" + config.GetIconPath() + " MyForm.cs"; 

// Invoke compilation of the source file. 
CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceName); 

string errorMessage; 

if (cr.Errors.Count > 0) 
{ 
    // Display compilation errors. 
    errorMessage = "Errors building {0} into {1}" + sourceName + cr.PathToAssembly + "\n"; 
    foreach (CompilerError ce in cr.Errors) 
    { 
     errorMessage += " {0}" + ce.ToString() + "\n"; 
    } 
    errorReport.ShowError(errorMessage); 
    errorReport.Show(); 

    status_content_label.Text = "Failed to create the exe file."; 
} 
else 
{ 
    status_content_label.Text = "Exe file successfully created."; 
} 

此为演示类构建:

using System; 
using System.Drawing; 
using System.Windows.Forms; 

class MyForm : Form 
{ 
    public MyForm() 
    { 
     this.Text = "Hello World"; 
     this.StartPosition = FormStartPosition.CenterScreen; 
    } 

    public static void Main() 
    { 
     Application.Run(new MyForm()); 
    } 
} 

谢谢你们。

回答

4

您应该更新您的编译选项是这样的:

cp.CompilerOptions = "/target:winexe /optimize /win32icon:" + config.GetIconPath() + " MyForm.cs"; 

要指示编译器编译一个Windows/GUI应用程序,而不是一个控制台应用程序(这是默认值)。

+0

谢谢你,这是正确的答案。 – sindney

0

真的很酷的想法,但不是IronRuby或IronPython更好的方法来处理这种情况或什么关于CLR中的Emit命名空间?

只是我的仙...