Как создать отдельный исполняемый файл для каждой формы для решения C # в VS 2008 с несколькими проектами с несколькими формами в одной сборке? - PullRequest
3 голосов
/ 04 декабря 2009

У меня есть решение на основе C # в Visual Studio 2008 для данной проблемной области. Это решение имеет 1 + 5 проектов. Первый проект предназначен для ресурсов, охватывающих другие 5 проектов.

Каждый проект имеет несколько форм. По умолчанию сборка генерирует один исполняемый файл на проект. Скорее, я хочу, чтобы каждая форма, которая не имеет взаимозависимости с остальными, создавала отдельный исполняемый файл.

Мне известно, что я могу разбить каждый из 5 основных проектов на несколько проектов и установить для «Startup Project» значение «Несколько проектов запуска» и достичь своей цели. Но это приведет к переполнению решения, когда число проектов увеличится до двухзначных чисел. Я не хочу идти по пути отдельного решения для каждого из 5 проектов.

Прямо сейчас я вызываю Application.Run следующим образом для достижения моей цели:

Application.Run(new fooForm());

и когда мне нужно создать исполняемый файл для другой независимой формы, я изменяю значение формы на

Application.Run(new barForm());

и так до тех пор, пока мне не понадобится еще одна порция эспрессо.

Любой взлом, чтобы выполнить то, что я намерен без меня выпрыгнуть из окна?

Ответы [ 5 ]

2 голосов
/ 09 декабря 2009
  1. Добавьте функцию Main к каждому классу формы и запустите ее самостоятельно.
  2. Создать пакетный файл для каждой формы / exe для компиляции проекта с использованием компилятора командной строки (csc.exe для C #), указав, какой класс (форма) содержит метод Main.

    public partial class Form2 : Form
    {
      [STAThread]
      static void Main()
      {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         Application.Run(new Form2());
      }
    }
    

Скомпилируйте исполняемый файл для form2, используя что-то вроде:

csc.exe /out:Form2.exe Form2.cs Form2.designer.cs  /Main:WindowsFormsApplication1.Form2
2 голосов
/ 07 декабря 2009

Возможно, вы можете оставить все в одном EXE-файле для каждого проекта и решить во время выполнения, с какой формы начинать. Например, вы можете сделать копии вашего EXE-файла с разными именами, определить имя EXE-файла из

  Assembly.GetExecutingAssembly().Location

и используйте эту информацию для выбора формы, которую вы поместили в «Application.Run».

Или вы не делаете копии и вызываете свой EXE с соответствующими параметрами командной строки. Это зависит от того, как ваши пользователи выбирают между различными отчетами базы данных.

Редактировать: вот простой пример (не проверенный):

[STAThread]
static void Main(string[] args)
{
    if(args.Length<1)
         return;
    if(args[0]=="Form1")
         Application.Run(new Form1());
    else if(args[0]=="Form2")
         Application.Run(new Form2());
}
1 голос
/ 09 декабря 2009

Используя идею Дока Брауна о том, чтобы просто использовать разные имена для exe-файлов, следующий код запустит приложение, используя форму с тем же именем, что и exe (MyNamespace.MyForm.exe запустит приложение с MyNamespace.MyForm как стартап-форма)

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        string FullPath = Assembly.GetExecutingAssembly().Location;
        string ExeName = Path.GetFileNameWithoutExtension(FullPath);
        Type TypeBasedOnExeName = Assembly.GetExecutingAssembly().GetType(ExeName);
        Form StartupForm = (Form)Activator.CreateInstance(TypeBasedOnExeName);

        Application.Run(StartupForm);
    }
0 голосов
/ 04 декабря 2009

Я бы предложил создать файл шаблона .csproj и создать многие из них с помощью небольшой программы на C # или Perl, заполнив шаблон значениями на основе форм в вашем решении. Затем вы можете агрегировать файлы .csproj, используя пакетный или Perl-скрипт для компиляции, используя devenv.exe из командной строки.

Нет реального "чистого" способа.

0 голосов
/ 04 декабря 2009

Нет ничего встроенного в Visual Studio, чтобы дать вам то, что вы хотите.

Любой взлом, чтобы выполнить то, что я намерен без меня выпрыгнуть из окна?

Если вы после взлома, возможно, вы захотите запустить ilasm.exe и ildasm.exe как часть шага после сборки: разберите 5 EXE-файлов и соберите их в> 5 EXE-файлов в соответствии с тем правилом, которое вы используете. повторяю.

...