Mi objetivo es crear un archivo ejecutable que inicie una aplicación copiada en la sombra. El truco es que quiero que este programa de inicio no tenga dependencias externas y no tenga que contener ningún conocimiento sobre el programa que tiene que comenzar.¿Puede un ensamblado C# .dll contener un punto de entrada?
También quiero que sea el único ejecutable en el directorio. En otras palabras, quiero que "ejecute" un ensamblado .dll, no un ensamblado .exe. (Puedo requerir que el nombre del archivo .dll cargado en un nuevo dominio de aplicación sea el mismo cada vez, como Main.dll o algo así.)
Parecía que AppDomain.ExecuteAssembly haría exactamente lo que yo quería. Dice que comenzará la ejecución en el "punto de entrada especificado en el encabezado .NET Framework".
Cuando intento usar esa función, aparece el error "No se encontró el punto de entrada en el ensamblado 'DllApp'".
El programa de arranque que tengo, tratando de ejecutar el ensamblado:
static void Main()
{
AppDomain domain = AppDomain.CreateDomain("DllApp");
domain.ExecuteAssembly("DllApp.dll");
}
El código de la aplicación, en un archivo .dll, con un punto de entrada por defecto:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
This page on Main() functions dice que "Las bibliotecas y los servicios no requieren un método principal como punto de entrada". No dice que no puede tener un punto de entrada predeterminado tampoco.
He intentado todas las diversas permutaciones de vacío, un tipo de público/privado estática principal de retorno int, string [] args como argumentos, con un espacio de nombres, sin espacio de nombres, clase estática/no estática, etc.
Pude cambiar mi código para heredarlo de MarshalByRefObject y luego usar CreateInstance para crear un objeto, pero parece que unirá más el starter al programa que se supone que debe comenzar. Si pudiera usar ExecuteAssembly, la aplicación que se está iniciando solo necesitaría un vacío static Main, y eso es realmente simple y difícil de estropear.
¿Es posible que un ensamblado .dll tenga un punto de entrada predeterminado, y para que ExecuteAssembly lo encuentre, o simplemente tengo que resignarme a seguir otra ruta?
No tiene sentido tener un punto de entrada para un ensamblado .NET (dll) ya que por sí solo no se inicia como un proceso. – Zenwalker