2009-08-31 4 views
3

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

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

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

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

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

+0

Вы можете, конечно, сделать этот тип вещи. Я не вижу причины удалить Main() из исполняемого файла WinForms. Как устанавливаются условия 1, условие2 и т. Д. Что происходит, что заставляет вас сказать, что это не дает ожидаемого результата? –

ответ

7

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

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

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

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

1

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

0

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

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

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

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

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

В 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(); 
    } 
}