Перемещение точки входа в DLL в приложении WinForm - PullRequest
3 голосов
/ 31 августа 2009

Я пытаюсь найти способ предварительно обработать несколько вещей перед загрузкой моего приложения WinForm. Я попытался поместить static void Main () в форму в проекте библиотеки классов и закомментировал его из Program.cs. В результате возникла ошибка времени компиляции: «... не содержит статический метод« Main », подходящий для точки входа». Это имеет смысл, поскольку программа не загружена, DLL также не загружается.

Итак, вопрос в том, есть ли способ сделать это вообще? Я хочу, чтобы форма в DLL могла определять, с какой формой запускать приложение:

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

   if(condition1)
   {
      Application.Run(new Form1());
   }
   else if(condition2)
   {
      Application.Run(new Form2());
   }
}

Эта логика будет использоваться в нескольких приложениях, поэтому имеет смысл поместить ее в общий компонент.

Ответы [ 5 ]

7 голосов
/ 31 августа 2009

Можете ли вы просто добавить статический метод в вашу DLL, который вызывает ваше приложение, вместо того, чтобы выполнять обработку в main?

// In DLL
public static class ApplicationStarter
{
     public static void Main()
     {
          // Add logic here.
     }
}

// In program:
{
     [STAThread]
     public static void Main()
     {
          ApplicationStarter.Main();
     }
}
1 голос
/ 31 августа 2009

Сохраняйте свой метод Main в Program.cs. Пусть он вызывает метод в dll, который создает экземпляр Form на основе условия и возвращает его в Main.

0 голосов
/ 31 августа 2009

По сути, вы пытаетесь создать собственную фабрику для формы, которая будет использоваться для приложения. Примерно так:

В EXE:

static void Main()
{
    Application.Run(new Factory.CreateForm());
}

и в вашей библиотеке:

public static class Factory 
{
    public static Form CreateForm()
    {
        if( condition ) return new Form1();
        else return new Form2();
    }
}
0 голосов
/ 31 августа 2009

static void Main () не имеет смысла в библиотеке классов, однако ваш фрагмент кода должен делать именно то, что вы хотите, если он помещен в Program.cs.

Кроме того, нужно ли вам универсальное предложение else, на случай, если условие1 и условие2 не будут выполнены? Может не требоваться, но в большинстве случаев я ожидаю, что какая-то форма обратной связи, а не приложение молча завершается - конечно, зависит от того, что вы делаете.

Изменить: Это может делать то, что вы хотите, если вам просто нужно разделить логику в библиотеку

// Program.cs
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    if(MyLib.Condition1)
    {
        Application.Run(new Form1());
    }
    else if(MyLib.Condition2)
    {
        Application.Run(new Form2());
   }
}


// MyLib.cs
...
public static bool Condition1
{
    get
    {
         return resultOfLogicForCondition1;
    }
}
public static bool Condition2
{
    get
    {
         return resultOfLogicForCondition2;
    }
}
0 голосов
/ 31 августа 2009

Метод «static void Main» должен находиться в сборке «EXE», но вы можете сделать так, чтобы этот метод вызывал версию «Main» вашей общей сборки. Вы просто не можете сделать это напрямую.

...