Frage

Ich versuche, einen Weg, um herauszufinden, vorverarbeitet paar Dinge vor meinen WinForm app Lasten. Ich habe versucht, in einem Klassenbibliotheksprojekt static void Main () in einer Form gebracht und kommentierte sie aus Program.cs. Welche erzeugt einen Kompilierung-Fehler: „... enthält keine statische‚Main‘Methode geeignet für einen Einstiegspunkt“. Es macht Sinn, da das Programm nicht geladen wird, wird die DLL auch nicht geladen.

Die Frage ist also, gibt es eine Möglichkeit, dies überhaupt zu tun? Ich mag die Form, in der DLL bestimmen zu können, welche Form die Anwendung starten mit:

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

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

Diese Logik wird in mehr als eine App verwendet werden, so ist es sinnvoll, sie in einer gemeinsamen Komponente setzen macht.

War es hilfreich?

Lösung

Können Sie nur eine statische Methode in der DLL hinzufügen, dass Ihre Anwendung Anrufe anstatt die Verarbeitung in Haupt tun?

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

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

Andere Tipps

Halten Sie Main-Methode in Program.cs. Lassen Sie es ein Verfahren, in dll aufrufen, die ein Formular über den Zustand und bringt sie zur Basis instanziiert.

Die „static void Main“ Methode hat Anordnung innerhalb der „EXE“ sein, aber man konnte diese Methode einen Aufruf an Ihre freigegebenen Assembly-Version von „Main“ machen. Sie können es einfach nicht direkt tun.

static void Main () keinen Sinn in einer Klassenbibliothek machen, aber Ihr Code-Snippet sollte genau das tun, was Sie, wenn in Program.cs platziert werden sollen.

Auch brauchen Sie eine Catch-All ‚else‘ Klausel, nur für den Fall condition1 und condition2 nicht erfüllt ist? Ist möglicherweise nicht erforderlich, aber in den meisten Fällen würde ich irgendeine Form von Feedback, anstatt die Anwendung still Verlassen erwarten -. Hängt davon ab, was Sie natürlich tun

Edit: Dies könnte das tun, was Sie wollen, wenn Sie einfach die Logik in eine Bibliothek benötigen trennen

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

Im Wesentlichen versuchen Sie eine eigene Fabrik für die Form zu verwenden für die Anwendung zu erstellen. Etwas wie folgt aus:

In der EXE-Datei:

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

und in Ihrer Bibliothek:

public static class Factory 
{
    public static Form CreateForm()
    {
        if( condition ) return new Form1();
        else return new Form2();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top