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();
}
}
}
Avez-vous vérifié le journal des événements? – stuartd
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
Non, est-ce que l'exécution du programme (qui se termine alors rapidement) enregistre quelque chose dans le journal des événements? –