Question

Je suis en train de trouver un moyen de pré-traiter quelques petites choses avant mes WinForm charges app. J'ai essayé de mettre void main () statique sous une forme dans un projet de bibliothèque de classe et hors de commentais Program.cs. Ce qui a généré une erreur de compilation: « ... ne contient pas statique méthode « principale » adapté à un point d'entrée ». Il est logique puisque le programme n'est pas chargé, la DLL n'est pas chargé non plus.

La question est, est-il un moyen de le faire du tout? Je veux que le formulaire dans la DLL pour être en mesure de déterminer quelle forme pour lancer l'application avec:

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

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

Cette logique sera utilisée dans plus d'une application donc il est logique de le mettre dans un composant commun.

Était-ce utile?

La solution

Pouvez-vous ajouter simplement une méthode statique dans votre DLL que votre application appelle au lieu de faire le traitement dans le principal?

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

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

Autres conseils

Gardez-vous la méthode principale de Program.cs. Laissez-le appeler une méthode dans dll qui instancie un formulaire basé sur la condition et le retourner au menu principal.

La méthode « static void Main » doit être dans le « EXE » l'assemblage, mais vous pouvez avoir cette méthode faire un appel à la version de votre assemblée partagée de « Main ». Vous ne pouvez pas le faire directement.

static void Main () n'a pas de sens dans une bibliothèque de classes, mais votre bout de code doit faire exactement ce que vous voulez si elles sont placées dans Program.cs.

En outre, vous avez besoin d'une clause fourre-tout « autre », juste au cas où condition1 et condition2 ne sont pas remplies? Ne peut pas être nécessaire, mais dans la plupart des cas, je me attends à une certaine forme de commentaires plutôt que l'application de sortir en silence -. Dépend de ce que vous faites bien sûr

Edit: Cela peut faire ce que vous voulez, si vous avez simplement besoin de séparer la logique dans une bibliothèque

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

Essentiellement, vous essayez de créer une usine personnalisée pour la forme à utiliser pour l'application. Quelque chose comme ce qui suit:

Dans le fichier EXE:

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

et dans votre bibliothèque:

public static class Factory 
{
    public static Form CreateForm()
    {
        if( condition ) return new Form1();
        else return new Form2();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top