Pergunta

Estou tentando descobrir uma maneira de pré-processar poucas coisas antes do meu aplicativo Winform carregar. Tentei colocar o estático void main () em um formulário em um projeto de biblioteca de classes e comentei no programa.cs. Que gerou um erro de tempo de compilação: "... não contém um método" principal "estático adequado para um ponto de entrada". Faz sentido, pois o programa não está carregado, a DLL também não é carregada.

Portanto, a questão é: existe uma maneira de fazer isso? Eu quero que o formulário na DLL seja capaz de determinar qual formulário iniciar o aplicativo com:

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

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

Essa lógica será usada em mais de um aplicativo, por isso faz sentido colocá -lo em um componente comum.

Foi útil?

Solução

Você pode apenas adicionar um método estático na sua DLL que seu aplicativo chama em vez de fazer o processamento no Main?

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

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

Outras dicas

Mantenha seu método principal no programa.cs. Deixe -o chamar um método na DLL que instancia um formulário com base na condição e devolva -o ao Main.

O método "estático void principal" deve estar dentro da montagem "exe", mas você pode fazer esse método fazer uma chamada para a versão de "Main" da sua assembléia compartilhada. Você simplesmente não pode fazer isso diretamente.

O estático void main () não faz sentido em uma biblioteca de classes, no entanto, seu trecho de código deve fazer exatamente o que você deseja se colocado no programa.cs.

Além disso, você precisa de uma cláusula "else", apenas no caso de condição1 e condição2 não são atendidos? Pode não ser necessário, mas na maioria dos casos eu esperaria alguma forma de feedback, em vez do aplicativo silenciosamente, depende do que você está fazendo, é claro.

EDIT: Isso pode fazer o que você quiser, se você simplesmente precisar separar a lógica em uma biblioteca

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

Essencialmente, você está tentando criar uma fábrica personalizada para o formulário usar para o aplicativo. Algo como o seguinte:

No exe:

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

E em sua biblioteca:

public static class Factory 
{
    public static Form CreateForm()
    {
        if( condition ) return new Form1();
        else return new Form2();
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top