Un assembly C # .dll peut-il contenir un point d'entrée?
Mon but est de créer un exécutable qui va démarrer une ombre copié application. Le truc, c'est, je veux que ce programme de démarreur ne pas avoir de dépendances externes et ne contenir aucun des connaissances sur le programme, il doit commencer.
Je veux aussi qu'il soit le seul exécutable dans le répertoire. En d'autres termes, je veux qu'elle "exécuter".dll assemblée pas .exe assemblée. (Je peut exiger que le nom de l' .dll fichier en cours de chargement dans un nouveau domaine d'application-être la même à chaque fois, comme Main.dll ou quelque chose comme ça).
Il ressemblait Domaine d'application.ExecuteAssembly serait faire exactement ce que je voulais. Il dit qu'il va commencer l'exécution sur le "point d'entrée spécifiée dans le .NET Framework-tête.".
Lorsque j'essaie d'utiliser cette fonction, je reçois l'erreur "point d'Entrée introuvable dans l'assembly 'DllApp'".
Le programme de démarreur que j'ai, juste essayer d'exécuter l'assemblée:
static void Main()
{
AppDomain domain = AppDomain.CreateDomain( "DllApp" );
domain.ExecuteAssembly( "DllApp.dll" );
}
Le code de l'application, dans une .fichier dll, avec une valeur par défaut: point d'entrée
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault( false );
Application.Run( new Form1() );
}
}
Cette page sur le main() fonctions dit que "les Bibliothèques et les services ne nécessitent pas de méthode main comme un point d'entrée". Cela ne veut pas dire qu'ils ne peut pas ont une valeur par défaut de point d'entrée.
J'ai essayé toutes les différentes permutations de privé/public static void main, un retour int type, string[] args comme arguments, avec un espace de noms, pas de noms, statique/non-classe statique, etc.
J'ai pu modifier mon code pour hériter de MarshalByRefObject, puis utiliser la méthode CreateInstance pour créer un objet, mais qui semble comme il sera plus étroitement couple le démarreur pour le programme, il est censé commencer. Si je pouvais utiliser ExecuteAssembly, la demande a commencé voudrais juste besoin d'un static void main, et c'est vraiment simple et dur de désordre.
Est-il possible pour un .dll assemblée d'avoir un défaut de point d'entrée, et pour ExecuteAssembly pour la trouver, ou dois-je me résigner à aller un autre itinéraire?
source d'informationauteur Sean
Vous devez vous connecter pour publier un commentaire.
Vous pouvez compiler un .NET application comme un fichier exe (qui est un assemblage) et renommez-le en un .DLL et il agira en tant que normale .NET .dll assemblée. Ensuite, il sera votre point d'Entrée.
J'ai trouvé les conseils pas si facile à suivre. Après quelques tests c'est comment j'en suis venu à succès:
J'ai créé une application de console avec un simple principal et inclus le reste du code à partir de mon DLL originale. Ci-dessous est un programme simplifié qui comprend une DLL:
Après la compilation j'ai renommé le générés .exe pour une .DLL.
Dans la mère de programme, qui utilise la DLL j'ai d'abord ajouté à la DLLTest.dll comme une Référence, puis j'ai ajouté le code à exécuter DLL.
Violà je pourrais exécuter et d'ajouter un point d'arrêt dans le DLLTest.Principale méthode et de voir que je pouvais invoquer le Principal de DLLTest. Merci pour la discussion!
Réponse courte est non. un .Le fichier DLL est une bibliothèque liée dynamiquement qui est appelé par une autre bibliothèque. Je suppose que ce que Keith a dit serait techniquement travail.. vous pourriez probablement renommer en ce que jamais vous voulez, même .txt ou .pdf aussi longtemps que vous démarrez l'application de la manière appropriée. La principale question que je me pose est la suivante; Qu'essayez-vous de faire?? Sauf si vous essayez d'écrire des logiciels malveillants pourquoi voudriez-vous faire cela?
Non pas que je condamne l'écriture de logiciels malveillants pour de mauvaises fins, mais je sais que les gens aiment expérimenter dans leur propre laboratoire afin que je ne condamne pas. Si vous écrivez quelque chose de logiciels malveillants tels que le c++, le c ou l'assembleur peut-être un meilleur pari je suppose que C# pourrait faire le travail, mais meh...