Я использую CSharpCodeProvider, чтобы сам скомпилировать .exe с переменными параметрами. Компиляция работает нормально (не возвращает ошибок) и завершается успешно, но при запуске она запускается и мгновенно завершается без каких-либо ошибок или выходных данных. При изменении «Основного» (например, на частный или путем его переименования) компилятор выводит, что действительного основного метода не существует, поэтому пример кода не должен быть причиной.
Есть ли у кого-нибудь на это ответ / решение? Я очень потерян в этом и буду признателен за любой полезный ответ. Заранее спасибо ~
*РЕДАКТИРОВАТЬ:
скомпилированный вывод .exe: http://imgur.com/a/WBvz3
Компилятор:
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;
}
}
}
Код для компиляции:
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();
}
}
}
ILDasm
и сравнивая с реальной программой, содержащей тот же код, можете ли вы заметить какие-либо различия? - person Lasse V. Karlsen   schedule 20.09.2016/target:exe
. - person Lasse V. Karlsen   schedule 20.09.2016