Pregunta

Estoy tratando de encontrar una manera de pre-procesar algunas cosas antes de mis cargas de aplicaciones WinForm. He intentado poner estática principal vacío () en un formulario dentro de un proyecto de biblioteca de clases y descomentado de Program.cs. Lo que generó un error de tiempo de compilación: "... no contiene un método estático 'Principal' adecuado para un punto de entrada". Que tiene sentido ya que el programa no está cargado, el DLL no se carga bien.

Así que la pregunta es, ¿hay alguna manera de hacer esto en absoluto? Quiero que el documento en el archivo DLL para poder determinar qué formulario para iniciar la aplicación con:

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

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

Esta lógica se utiliza en más de una aplicación así que tiene sentido para ponerlo en un componente común.

¿Fue útil?

Solución

Puede usted sólo tiene que añadir un método estático en su DLL que la aplicación llama en vez de hacer el procesamiento en el principal?

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

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

Otros consejos

Mantenga su método principal en Program.cs. Deja que llamar a un método en el DLL que crea la instancia de un formulario basado en la condición y lo devolverá a la información principal.

El método "static void Main" tiene que estar dentro del conjunto "EXE", pero que podría tener este método de hacer una llamada a la versión de ensamblado compartido de "Principal". Usted simplemente no puede hacerlo directamente.

estática principal vacío () no tiene sentido en una biblioteca de clases, sin embargo, su fragmento de código debe hacer exactamente lo que quiere si se coloca en Program.cs.

Además, qué necesita un cajón de sastre cláusula 'otra cosa', por si acaso condición1 y condición2 no se cumplen? puede no ser necesaria, pero en la mayoría de los casos que se puede esperar algún tipo de retroalimentación en lugar de la aplicación de forma silenciosa salir -. Depende de lo que está haciendo, por supuesto

Edit: Esto puede hacer lo que quiera, si sólo hay que separar la lógica en una 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;
    }
}

En esencia, usted está tratando de crear una fábrica a la medida para la forma de utilizar para la aplicación. Algo parecido a lo siguiente:

En el EXE:

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

y en su biblioteca:

public static class Factory 
{
    public static Form CreateForm()
    {
        if( condition ) return new Form1();
        else return new Form2();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top