Menu

[C#] Charger les références ( assembly .dll ) au runtime

Messages postés
3
Date d'inscription
vendredi 28 décembre 2018
Dernière intervention
3 janvier 2019
- - Dernière réponse : nitorax
Messages postés
3
Date d'inscription
vendredi 28 décembre 2018
Dernière intervention
3 janvier 2019
- 3 janv. 2019 à 18:34
Bonjour,

Je développe une application modulaire. Cette application n'a clairement aucun intérêt si ce n'est que de m’entraîner à maîtriser le c# donc s'il vous plaît ne me dîtes pas "Il y a des manière beaucoup plus simples de faire". Bon alors voilà. J'ai un projet principal "Stiveno.exe" ( Console .net FRAMEWORK ), qui utilise en référence un autre projet "Utils.dll" ( librairy .NET FRAMEWORK ). Des les paramètres de ma références j'ai mis "Copie locale" à false. Dans mon dossier de sortie je n'ai donc que MonProjet.exe. Hors comme vous vous en doutez s'il n'y a pas ma référence qui est exporté dans le même dossier au lancement j'ai une erreur et c'est normale puisque ma lbrairy n'est pas trouvé donc dès la première ligne de code qui y fait référence *pouf* exception. Pour résoudre ça j'utilise donc :
AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(LibrariesPath + "Utils.dll"));
foreach (var item in AppDomain.CurrentDomain.GetAssemblies())
{
        LogWarning(item.GetName().Name);
}

La première ligne charge donc mon assembly et le foreach affiche les assembly chargés. Je peux donc voir que mon assembly apparait bien et jusque là tout me semble correct. Hors dès que j'appel une méthode contenant une ligne de code faisant référence à mon assembly *pouf* exception :
System.IO.FileNotFoundException : 'Impossible de charger le fichier ou l'assembly 'Utils, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ou une de ses dépendances. Le fichier spécifié est introuvable.'

Je tien à préciser que l'assembly se trouve dans un dossier autre que celui de Stiveno.exe, que l'assembly et le chemin d'accès sont bien correct, que Utils.dll n'a aucune dépendances particulières et que donc je ne comprend absolument pas cette exception.
J'espère que mon problème est claire. Je peux vous envoyer mon projet si nécessaire pour que vous testiez vous même.
Afficher la suite 

Votre réponse

2 réponses

Messages postés
12598
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 janvier 2019
765
0
Merci
Bonjour

Il y a deux façons de voir les choses.
  • tu essayes de reproduire le fonctionnement de la framework, par exemple tu te sers de l’assembly System sans l’avoir dans ton répertoire. Dans ce cas il faut installer ton assembly dans le GAC https://docs.microsoft.com/fr-fr/dotnet/framework/app-domains/gac et ton code n’est pas utile.
  • tu souhaites faire un programme avec des plugins. Là c’est plus compliqué, je l’ai fait une fois au travail, y a longtemps. Ça se fait peut être bien avec ce type de code. Il me semble me souvenir qu’il fallait une classe abstraite et une classe fille qui « ne fait rien » chargée normalement dans le projet et une autre classe fille, qui fait le job que l’on charge peut-être avec ton code. Je reprends le boulot le 7 janvier, pas sûr d’avoir l’occasion de vérifier mes dires ce jour là. En attendans, tu peux chercher pugin C# sur le net (j’avais trouvé comme ça) où espérer qu’un autre membre sache.

Commenter la réponse de Whismeril
Messages postés
3
Date d'inscription
vendredi 28 décembre 2018
Dernière intervention
3 janvier 2019
0
Merci
Merci pour ta reponse. Alors aucune des 2 solutions ne me conviennent. Je ne souhaite pas placer mes assembly dans le CAG ni faire un system de plugins puisque je sais quels assembly doivent etre chargé precisément. J'ai un projet qui fait reference a 2 assembly disons. Sauf que quand je lance mon projet les assembly ne se trouve pas dans le même dossier que mon executable. Ainsi je dois les charger manuellement dès le lancement de mon programme. Sauf que etrangement ça ne fonctionne pas comme ça devrait j'ai l'exception dites dans mon premier message qui est levée.
Merci de votre aide
Whismeril
Messages postés
12598
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 janvier 2019
765 -
Pour moi, ça correspond au plugin.
nitorax
Messages postés
3
Date d'inscription
vendredi 28 décembre 2018
Dernière intervention
3 janvier 2019
> Whismeril
Messages postés
12598
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
23 janvier 2019
-
Il faut utiliser une interface ou des classes abstraites pour faire un system de plugins. Hors là ce n'est pas le cas puisque je veux juste charger mes references manuellement dans l'AppDomain principal. Sauf que ça ne fonctionne pas comme ça devrait. Je dois surement mal faire un truc. Mon code est plus haut. Pourriez vous me dire comment vous vous y seriez pris vous ?
Commenter la réponse de nitorax