Il mio obiettivo è creare un eseguibile che avvii un'applicazione shadow copiata. Il trucco è che voglio che questo programma di avviamento non abbia dipendenze esterne e non debba contenere alcuna conoscenza sul programma che deve iniziare.Un assembly C# .dll può contenere un punto di ingresso?
Voglio anche che sia l'unico eseguibile nella directory. In altre parole, voglio che esegua un assembly .dll e non un assembly .exe. (Posso richiedere che il nome del file DLL è caricato in una nuova AppDomain essere lo stesso ogni volta, come Main.dll o qualcosa di simile.)
Sembrava AppDomain.ExecuteAssembly farebbe esattamente quello che volevo. Dice che inizierà l'esecuzione nel "punto di ingresso specificato nell'intestazione .NET Framework".
Quando si tenta di utilizzare tale funzione viene visualizzato l'errore "Punto di ingresso non trovato nell'assembly" DllApp "".
Il programma di avviamento che ho, solo cercando di eseguire il montaggio:
static void Main()
{
AppDomain domain = AppDomain.CreateDomain("DllApp");
domain.ExecuteAssembly("DllApp.dll");
}
Il codice dell'applicazione, in un file dll, con un punto di voce predefinita:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
This page on Main() functions afferma che "Le biblioteche e i servizi non richiedono un metodo Main come punto di ingresso". Non dice che non può avere un punto di ingresso predefinito.
Ho provato tutte le varie permutazioni di principale, di tipo pubblico/privato static void int di ritorno, string [] args come argomenti, con uno spazio dei nomi, senza spazio dei nomi, non statico-classe statica /, ecc
Sono stato in grado di modificare il mio codice per ereditarlo da MarshalByRefObject e quindi utilizzare CreateInstance per creare un oggetto, ma sembra che accoppierà più strettamente l'iniziatore al programma che dovrebbe iniziare. Se potessi usare ExecuteAssembly, l'applicazione avviata avrebbe solo bisogno di un vuoto statico Main, e questo è davvero semplice e difficile da rovinare.
È possibile che un assembly .dll abbia un punto di ingresso predefinito e che ExecuteAssembly lo trovi o devo semplicemente ripromettersi ad andare su un'altra rotta?
Non ha senso avere un punto di ingresso per un assembly .NET (dll) che da solo non viene avviato come processo. – Zenwalker