Mes DLL sont chargées par une application tierce, que nous ne pouvons pas personnaliser. Mes assemblys doivent se trouver dans leur propre dossier. Je ne peux pas les mettre dans GAC (mon application doit être déployée avec XCOPY). Lorsque la DLL racine tente de charger une ressource ou un type à partir d'une autre DLL (dans le même dossier), le chargement échoue (FileNotFound). Est-il possible d'ajouter le dossier dans lequel se trouvent mes DLL au chemin de recherche d'assembly par programme (à partir de la DLL racine)? Je ne suis pas autorisé à modifier les fichiers de configuration de l'application.
la source
if (!File.Exists(asmPath)) return searchInGAC(...);
Vous pouvez ajouter un chemin de détection au fichier .config de votre application, mais cela ne fonctionnera que si le chemin de détection est contenu dans le répertoire de base de votre application.
la source
AssemblyResolve
solution tant de fois, c'est bien d'avoir une autre option (et plus simple).Mise à jour pour Framework 4
Étant donné que Framework 4 déclenche également l'événement AssemblyResolve pour les ressources, ce gestionnaire fonctionne mieux. Il est basé sur le concept que les localisations sont dans les sous-répertoires de l'application (un pour la localisation avec le nom de la culture, c'est-à-dire C: \ MyApp \ it pour l'italien) À l'intérieur, il y a un fichier de ressources. Le gestionnaire fonctionne également si la localisation est un pays-région, c'est-à-dire it-IT ou pt-BR. Dans ce cas, le gestionnaire "peut être appelé plusieurs fois: une fois pour chaque culture de la chaîne de secours" [de MSDN]. Cela signifie que si nous retournons null pour le fichier de ressources "it-IT", le framework déclenche l'événement en demandant "it".
Crochet d'événement
Gestionnaire d'événements
la source
AssemblyName
constructeur pour décoder le nom de l'assembly au lieu de vous fier à l'analyse de la chaîne d'assembly.La meilleure explication de MS lui - même :
la source
AssemblyResolve
est pour CurrentDomain, non valide pour un autre domaineAppDomain.CreateDomain
Pour les utilisateurs C ++ / CLI, voici la réponse de @Mattias S (qui fonctionne pour moi):
la source
J'ai utilisé la solution de @Mattias S. Si vous souhaitez réellement résoudre les dépendances à partir du même dossier, vous devez essayer d'utiliser Requesting assembly location, comme indiqué ci-dessous. args.RequestingAssembly doit être vérifié pour la nullité.
la source
regardez dans AppDomain.AppendPrivatePath (obsolète) ou AppDomainSetup.PrivateBinPath
la source
AppDomain.AppendPrivatePath
La documentation de semble suggérer qu'elle devrait prendre en charge l'expansion dynamique duAppDomain
chemin de recherche de, juste que la fonctionnalité est obsolète. Si cela fonctionne, c'est une solution beaucoup plus propre que la surchargeAssemblyResolve
.AppDomain.AppendPrivatePath
ne rien faire dans .NET Core et les mises.PrivateBinPath
à jour dans le cadre complet .Je suis venu ici d' une autre question (marquée en double) sur l'ajout de la balise de sondage au fichier App.Config.
Je veux ajouter une note à cela - Visual Studio avait déjà généré un fichier App.config, mais l'ajout de la balise de détection à la balise d'exécution prégénérée ne fonctionnait pas! vous avez besoin d'une balise d'exécution séparée avec la balise de détection incluse. En bref, votre App.Config devrait ressembler à ceci:
Cela a pris du temps à comprendre, donc je le poste ici. Crédits également au package PrettyBin NuGet . C'est un package qui déplace automatiquement les dll. J'ai aimé une approche plus manuelle donc je ne l'ai pas utilisée.
Aussi - voici un script post build qui copie tous les fichiers .dll / .xml / .pdb dans / Lib. Cela désencombre le dossier / debug (ou / release), ce que je pense que les gens essaient de réaliser.
la source