Перемещение точки входа в DLL в приложении WinForm

StackOverflow https://stackoverflow.com/questions/1358976

  •  20-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь найти способ предварительной обработки нескольких вещей перед загрузкой моего приложения 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());
   }
}

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

Это было полезно?

Решение

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

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

// In program:
{
     [STAThread]
     public static void Main()
     {
          ApplicationStarter.Main();
     }
}

Другие советы

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

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

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

Кроме того, вам нужно всеобъемлющее предложение 'else', на всякий случай, если condition1 и condition2 не будут выполнены?Возможно, это и не требуется, но в большинстве случаев я бы ожидал какой-то формы обратной связи, а не автоматического выхода из приложения - конечно, зависит от того, что вы делаете.

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

// 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;
    }
}

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

В исполняемом файле:

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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top