Код C #, скомпилированный .exe, не запускается

Я использую 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();
        }
    }
}

person ThexBasic    schedule 20.09.2016    source источник
comment
Вы проверили журнал событий?   -  person stuartd    schedule 20.09.2016
comment
Если вы говорите о выводе компилятора, то да. Он возвращает истину и выводит 0 ошибок. - поэтому успешно компилируется. Также я проверил сборку с помощью ILSpy, и она выглядит нормально.   -  person ThexBasic    schedule 20.09.2016
comment
Нет, выполнение программы (которая затем сразу завершается) регистрирует что-нибудь в журнале событий?   -  person Lasse V. Karlsen    schedule 20.09.2016
comment
А используя ILDasm и сравнивая с реальной программой, содержащей тот же код, можете ли вы заметить какие-либо различия?   -  person Lasse V. Karlsen    schedule 20.09.2016
comment
Лассе В. Карлсен, я только что включил изображение запуска семпла, он ничего не выводит.   -  person ThexBasic    schedule 20.09.2016
comment
Просто добавьте параметр / pdb, чтобы можно было отлаживать созданную программу.   -  person Hans Passant    schedule 20.09.2016
comment
/ target: winexe? Итак, программа WinForms? Попробуйте вместо этого /target:exe.   -  person Lasse V. Karlsen    schedule 20.09.2016
comment
Программа напрямую не имеет форм, но вызывает сборку, в которой - нужно ли мне что-то менять для этого? Я не нашел полезной документации о параметрах компилятора.   -  person ThexBasic    schedule 20.09.2016
comment
Что ж, ваша программа делает больше, чем то, что у вас сейчас есть в примере? Как попытка открыть форму , но этого тоже не происходит? Или вы упростили его до сути вопроса, пытаясь найти причину? Имейте в виду, что мы можем ответить только на заданный вопрос, а не на вопрос, который вы должны были задать. Опубликуйте минимальный воспроизводимый пример, который, как вы подтвердили, имеет ту же проблему.   -  person Lasse V. Karlsen    schedule 20.09.2016


Ответы (1)


Вы создали программу WinForms.

У него нет консоли, и он ничего не выводит на консоль, с которой был запущен.

Откуда мне знать? Этот:

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

Какой из csc:

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

Вместо этого переключитесь на /target:exe, и он должен работать намного лучше.

person Lasse V. Karlsen    schedule 20.09.2016
comment
хорошо, это многое объясняет. Если я хочу впоследствии вызвать сборку, которая имеет формы, нужно ли мне снова рассматривать конструктор? - person ThexBasic; 20.09.2016
comment
Что ж, вы, вероятно, вернетесь к /target:winexe, но это никоим образом не разрешает (или, в противном случае, запрещает) использование форм. Основное различие заключается в том, будет ли программа запускаться с подключенной консолью. Если вы этого хотите, используйте /target:exe. Если вы этого не хотите, используйте /target:winexe. В любом случае вам, вероятно, следует добавить соответствующие вызовы Application.XYZ методов в свой основной метод. Посмотрите на обычную программу WinForms, чтобы найти нужные операторы по умолчанию. - person Lasse V. Karlsen; 20.09.2016
comment
Но все это не имеет значения, если ваш текущий тест на то, успешно ли вы скомпилировали проект, заключается в том, выводит ли он что-то на консоль. В этом случае вы должны создать консольное приложение, и это делается с помощью /target:exe. - person Lasse V. Karlsen; 20.09.2016
comment
Установка /target:exe решила мою проблему на данный момент. Сейчас я работаю над интеграцией другой сборки, и если у меня возникнут проблемы, воспользуйтесь вашим советом или отправьте отдельный вопрос. Спасибо! - person ThexBasic; 20.09.2016