Domanda

Sto cercando di capire un modo per pre-processo alcune cose prima che i miei WinForm carichi app. Ho provato a mettere static void Main () in una forma all'interno di un progetto libreria di classi e commentato fuori dalla Program.cs. Che ha generato un errore di compilazione: "... non contiene un metodo statico 'principale' adatto per un punto di ingresso". Ha senso in quanto il programma non viene caricato, la DLL non viene caricata sia.

Quindi la domanda è, c'è un modo per fare questo a tutti? Voglio che il modulo nella DLL per essere in grado di determinare quale forma per lanciare l'applicazione con:

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

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

Questa logica sarà utilizzato in più di un app quindi ha senso per dirla in un componente comune.

È stato utile?

Soluzione

Si può solo aggiungere un metodo statico nella DLL che l'applicazione chiama invece di fare l'elaborazione in main?

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

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

Altri suggerimenti

Mantenere si metodo Main in Program.cs. Lasciate chiamare un metodo in DLL che crea un'istanza di un modulo in base alla condizione e tornare alla principale.

Il metodo "static void Main" deve essere all'interno del gruppo "EXE", ma si potrebbe avere questo metodo effettuare una chiamata alla versione del vostro assembly condiviso di "principale". Non ci si può farlo direttamente.

static void Main () non ha senso in una libreria di classi, ma il vostro frammento di codice dovrebbe fare esattamente quello che vuoi, se posto in Program.cs.

Inoltre, avete bisogno di una clausola onnicomprensiva 'altra cosa', nel caso in cui condizione1 e condizione2 non sono soddisfatte? potrebbe non essere necessaria, ma nella maggior parte dei casi mi sarei aspettato una qualche forma di feedback, piuttosto che l'applicazione in silenzio in uscita -. Dipende da cosa si sta facendo, naturalmente,

Edit: Questo potrebbe fare quello che vuoi, se è sufficiente per separare la logica in una libreria

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

In sostanza si sta cercando di creare una fabbrica su misura per il modulo da utilizzare per l'applicazione. Qualcosa di simile a quanto segue:

Nel EXE:

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

e nella libreria:

public static class Factory 
{
    public static Form CreateForm()
    {
        if( condition ) return new Form1();
        else return new Form2();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top