¿Puede un ensamblado C#.dll contener un punto de entrada?
assemblies appdomain (3)
Encontré el consejo no tan fácil de seguir. Después de algunos experimentos, así es como llegué al éxito:
Creé una aplicación de consola con un simple main e incluí el resto del código de mi DLL original. A continuación se muestra un programa simplificado que incluye una DLL:
namespace FIT.DLLTest
{
public class DLLTest
{
[STAThread]
static void Main(string[] args)
{
int a = 1;
}
public DLLTest()
{
int b = 17;
}
public int Add(int int1, int int2)
{
return int1 + int2;
}
}
}
Después de la compilación, cambié el nombre del archivo .exe generado a .DLL.
En el programa de la madre, que utiliza la DLL, primero agregué DLLTest.dll como referencia, luego agregué el código para ejecutar la DLL.
namespace TestDLLTest
{
class TestDLLTest
{
static void Main(string[] args)
{
AppDomain domain = AppDomain.CreateDomain( "DLLTest" );
domain.ExecuteAssembly( "DllTest.dll" );
DLLTest dt = new DLLTest();
int res2 = dt.Add(6, 8);
int a = 1;
}
}
}
Violà pude ejecutar y agregar un punto de interrupción en el método DLLTest.Main y ver que podría invocar Main of DLLTest. Gracias por la discusión amigos!
Mi objetivo es crear un 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 iniciar.
También quiero que sea el único ejecutable en el directorio. En otras palabras, quiero que "ejecute" un ensamblado .dll y no un ensamblado .exe. (Puedo requerir que el nombre del archivo .dll que se carga 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 quería. Dice que comenzará la ejecución en el "punto de entrada especificado en el encabezado de .NET Framework".
Cuando trato de usar esa función, aparece el error "No se encontró el punto de entrada en el ensamblaje ''DllApp''".
El programa de inicio que tengo, solo intento ejecutar el ensamblaje:
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 predeterminado:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new Form1() );
}
}
Esta página en las funciones Main () dice que "las bibliotecas y los servicios no requieren un método Main como punto de entrada". No dice que tampoco pueden tener un punto de entrada predeterminado.
He probado todas las diversas permutaciones de main / void static public public, private int type, 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 se acoplará más estrechamente el iniciador al programa que se supone que debe comenzar. Si pudiera usar ExecuteAssembly, la aplicación que se está iniciando solo necesitaría un Main estático vacío, y eso es realmente simple y difícil de desordenar.
¿Es posible que un ensamblado .dll tenga un punto de entrada predeterminado y que ExecuteAssembly lo encuentre, o simplemente tengo que resignarme a ir a otra ruta?
La respuesta corta es no. un archivo .DLL es una biblioteca enlazada dinámicamente que es un código llamado por otra biblioteca. Supongo que lo que Keith dijo que funcionaría técnicamente ... probablemente podría cambiarle el nombre a lo que quiera, incluso .txt o .pdf, siempre y cuando inicie la aplicación de la manera adecuada. La pregunta principal que tengo es esta; ¿¿Que estás tratando de hacer?? A menos que estés intentando escribir malware, ¿por qué querrías hacer esto? No es que condono la escritura de malware con malos propósitos, pero sé que a las personas les gusta experimentar en su propio laboratorio, por lo que, por mi parte, no lo condeno. Si está escribiendo malware, algo como c ++, c o assembler podría ser una mejor opción, supongo que C # podría hacer el trabajo, pero meh ...
Puede compilar una aplicación .NET como un exe (que es un ensamblado) y cambiarle el nombre a un .DLL y actuará como un ensamblado .NET de .NET normal. A continuación, tendrá su punto de entrada.