2010-04-18 19 views
1

Je viens de créer mon propre petit compilateur C# personnalisé, en utilisant l'article de MSDN. Mais, quand je crée une nouvelle application Windows Forms en utilisant mon exemple de compilateur, la fenêtre MSDOS apparaît aussi, et si je ferme la fenêtre DOS, mon application WinForms se ferme aussi. Comment puis-je dire au compilateur? ne pas afficher la fenêtre MSDOS?Masquage de l'invite de commande avec CodeDomProvider

Merci :)

Voici mon code:

using System; 

namespace JTS 
{ 
    public class CSCompiler 
    { 
     protected string ot, 
      rt, 
      ss, es; 

     protected bool rg, cg; 

     public string Compile(String se, String fe, String[] rdas, String[] fs, Boolean rn) 
     { 
      System.CodeDom.Compiler.CodeDomProvider CODEPROV = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp"); 
      ot = 
       fe; 

      System.CodeDom.Compiler.CompilerParameters PARAMS = new System.CodeDom.Compiler.CompilerParameters(); 
      // Ensure the compiler generates an EXE file, not a DLL. 
      PARAMS.GenerateExecutable = true; 
      PARAMS.OutputAssembly = ot; 
      PARAMS.CompilerOptions = "/target:winexe"; PARAMS.ReferencedAssemblies.Add(typeof(System.Xml.Linq.Extensions).Assembly.Location); 
      PARAMS.LinkedResources.Add("this.ico"); 

      foreach (String ay in rdas) 
      { 
       if (ay.Contains(".dll")) 
        PARAMS.ReferencedAssemblies.Add(ay); 
       else 
       { 
        string refd = ay; 
        refd = refd + ".dll"; 
        PARAMS.ReferencedAssemblies.Add(refd); 
       } 

      } 

      System.CodeDom.Compiler.CompilerResults rs = CODEPROV.CompileAssemblyFromFile(PARAMS, fs); 

      if (rs.Errors.Count > 0) 
      { 
       foreach (System.CodeDom.Compiler.CompilerError COMERR in rs.Errors) 
       { 
        es = es + 
         "Line number: " + COMERR.Line + 
         ", Error number: " + COMERR.ErrorNumber + 
         ", '" + COMERR.ErrorText + ";" + 
         Environment.NewLine + Environment.NewLine; 
       } 
      } 
      else 
      { 
       // Compilation succeeded. 
       es = "Compilation Succeeded."; 

       if (rn) System.Diagnostics.Process.Start(ot); 
      } 
      return es; 
     } 
    } 
} 
+1

DOS! = Invite de commande –

+0

Désolé, mon erreur. Je vous remercie. :) –

Répondre

4

En compilateur C# fenêtre de la console est affiché lorsque commutateur/cible est exe. Lorsque/target = winexe, la fenêtre de la console n'est pas affichée. http://msdn.microsoft.com/en-us/library/6h25dztx.aspx

Essayez ceci:

 
System.CodeDom.Compiler.CompilerParameters PARAMS = new System.CodeDom.Compiler.CompilerParameters(); 

PARAMS->CompilerOptions = "/target:winexe"; 

Voir: http://msdn.microsoft.com/en-us/library/system.codedom.compiler.compilerparameters.compileroptions.aspx

+0

Où puis-je modifier ces propriétés? J'ai posté mon code dans ma question. Merci –

+0

Merci beaucoup! Mais il affiche toujours la fenêtre d'invite de commandes. –

+1

Désolé, ce devrait être:/target: winexe –

1

Je ne sais pas qui MSDN article vous faites référence, mais si vous utilisez le AssemblyBuilder alors la "magie" est en l'appel au SetEntryPoint.

Si vous avez une application Windows Forms, vous devez spécifier PEFileKinds.WindowApplication:

var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(
    new AssemblyName(assemblyName), AssemblyBuilderAccess.Save); 
var mod = asm.DefineDynamicModule(assemblyName, fileName);   
var type = mod.DefineType("Program", 
    TypeAttributes.Class | TypeAttributes.Sealed | TypeAttributes.Public); 
var mainMethod = type.DefineMethod("Main", 
    MethodAttributes.Public | MethodAttributes.Static); 
// ... Code for Main method and the rest ... 
type.CreateType(); 
asm.SetEntryPoint(mainMethod,PEFileKinds.WindowApplication); 
asm.Save(fileName); 

Autres PEFileKinds sont ConsoleApplication et dll, même si je pense que le AssemblyBuilder assume automatiquement est une dll si vous ne spécifiez pas un EntryPoint.

+0

Merci pour votre réponse détaillée, je l'essaie maintenant. Voici le lien vers l'article MSDN auquel je faisais référence: http://support.microsoft.com/kb/304655 –

+0

Hum, à moins que je ne colle votre code au mauvais endroit, j'ai l'impression que ce n'est pas exactement être pertinent, car cela n'a absolument aucun effet. S'il vous plaît voir ma question, comme je l'ai édité pour contenir mon code afin que vous puissiez voir comment j'ai créé le compilateur. :) –

+0

Ah, vous utilisez CodeDom. Non, mon code ne fonctionnerait pas, je l'ai ajouté avant d'avoir vu votre exemple de code et je n'étais pas sûr de ce que vous utilisiez. –