2016-09-20 2 views
2

J'utilise CSharpCodeProvider pour compiler moi-même un fichier .exe avec des paramètres variables. La compilation fonctionne correctement (ne renvoie pas d'erreurs) et réussit mais au démarrage, elle démarre et se ferme instantanément sans aucune erreur ou sortie. Lors de la modification de la "Main" (par exemple privé ou en le renommant) le compilateur sort qu'il n'y a aucune méthode principale valide, de sorte que le code d'échantillon ne devrait pas être la raison.C# Le code .exe compilé ne s'exécute pas

Quelqu'un at-il une réponse/solution à cela? Je suis assez perdu sur celui-ci et j'apprécierais toute réponse utile. Merci à l'avance ~

* EDIT:

compilé sortie .exe: http://imgur.com/a/WBvz3

compilateur:

using System; 
using System.CodeDom.Compiler; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Resources; 
using System.Security.Cryptography; 
using System.Text; 
using Microsoft.CSharp; 
using Packer.Properties; 

namespace Packer 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      Console.WriteLine("Sample Compiler"); 
      Console.WriteLine(".ico-path: "); 
      var icon = "E:\\sample.ico"; //Console.ReadLine(); 
      Console.WriteLine("> " + icon); 
      Console.WriteLine("Target-exe: "); 
      var target = "E:\\sample.exe"; //Console.ReadLine(); 
      Console.WriteLine("> " + target); 
      var source = Resources.samplesource; 
      // Compile with all params 
      var success = CompileFromSource(source, target, icon); 
      // Determine result 
      Console.WriteLine(success ? "Successfully compiled." : "Compiling error."); 
      if (success) Process.Start(target); 
      Console.ReadLine(); 
     } 

     private static bool CompileFromSource(string source, string output, 
string icon = null, string[] resources = null) 
     { 
      var cParams = new CompilerParameters 
      { 
       GenerateInMemory = true, 
       WarningLevel = 0, 
       GenerateExecutable = true, 
       OutputAssembly = output 
      }; 
      var options = "/optimize+ /platform:x86 /target:winexe /unsafe"; 
      if (icon != null) 
       options += " /win32icon:\"" + icon + "\""; 
      // Set the options. 
      cParams.CompilerOptions = options; 
      cParams.TreatWarningsAsErrors = false; 
      cParams.ReferencedAssemblies.Add("System.dll"); 
      cParams.ReferencedAssemblies.Add("System.Core.dll"); 
      cParams.ReferencedAssemblies.Add("System.Data.dll"); 
      // Check if the user specified any resource files. & Add them 
      if (resources != null && resources.Length > 0) 
      { 
       // Loop through all resource files specified in the Resources[] array. 
       foreach (var res in resources) 
       { 
        // Add each resource file to the compiled stub. 
        cParams.EmbeddedResources.Add(res); 
       } 
      } 
      // Dictionary variable is used to tell the compiler what we want 
      var providerOptions = new Dictionary<string, string> {{"CompilerVersion", "v4.0"}}; 
      var results = new CSharpCodeProvider(providerOptions).CompileAssemblyFromSource(cParams, source); 
      // Check if any errors occured while compiling. 
      if (results.Errors.Count <= 0) return true; 
      Console.WriteLine("The compiler has encountered {0} errors", results.Errors.Count); 
      foreach (CompilerError err in results.Errors) 
      { 
       Console.WriteLine("{0}\nLine: {1} - Column: {2}\nFile: {3}", err.ErrorText, err.Line, err.Column, 
        err.FileName); 
      } 
      return false; 
     } 
    } 
} 

Le code à compiler:

using System; 
using System.Text; 

namespace CC2Runner 
{ 
    public static class Program 
    { 
     public static void Main(string[] args) 
     { 
      try 
      { 
       Debug.WriteLine("Sample Starting..."); 
       Console.WriteLine("Sample Starting..."); 
       ... 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e); 
      } 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Avez-vous vérifié le journal des événements? – stuartd

+0

Si vous parlez de la sortie du compilateur, oui. Il renvoie true et imprime 0 erreurs. - donc compile avec succès. J'ai également vérifié l'assemblage en utilisant ILSpy et il semble juste normal. – ThexBasic

+1

Non, est-ce que l'exécution du programme (qui se termine alors rapidement) enregistre quelque chose dans le journal des événements? –

Répondre

5

Vous avez créé un programme WinForms.

Ceci n'a pas de console et ne génère aucun résultat pour la console à partir de laquelle il a été démarré.

Comment savoir? Ce:

var options = "/optimize+ /platform:x86 /target:winexe /unsafe"; 
             ^^^^^^^^^^^^^^ 

qui de csc:

/target:exe     Build a console executable (default) (Short 
           form: /t:exe) 
/target:winexe    Build a Windows executable (Short form: 
           /t:winexe) 

Passer à la place /target:exe et il devrait fonctionner beaucoup mieux.

+0

ok, cela explique beaucoup. Si je veux Invoquer ensuite un assemblage qui a des formes, dois-je reconsidérer le constructeur? – ThexBasic

+0

Eh bien, vous reviendrez probablement à '/ target: winexe' mais cela n'autorise en aucun cas (ou dans le cas contraire, interdisera) l'utilisation de formulaires. La principale différence est de savoir si le programme va démarrer avec une console attachée. Si vous le souhaitez, utilisez '/ target: exe'. Si vous ne le souhaitez pas, utilisez '/ target: winexe'. Vous devriez probablement ajouter les appels de méthode 'Application.XYZ' appropriés dans votre méthode principale, dans les deux cas.Regardez un programme WinForms normal pour trouver les bonnes instructions à avoir par défaut. –

+0

Mais rien de tout cela important si votre test actuel pour savoir si vous avez compilé avec succès le projet est de savoir si il sort quelque chose à la console. Si c'est le cas, vous devez créer une application console, et ceci est fait avec '/ target: exe'. –