J'utilise un cadre personnalisé qui utilise la réflexion pour faire un GetTypeByName(string fullName)
sur le nom de type complet qu'il obtient de la base de données, pour créer une instance de ce type et l'ajouter à la page, résultant en un type modulaire standard de chose.L'assembly n'est pas disponible après le changement Web.config
GetTypeByName
est une fonction d'utilité de la mienne qui itère simplement par Thread.GetDomain().GetAssemblies()
, puis exécute un assembly.GetType(fullName)
pour trouver le type approprié. Évidemment, ce résultat est mis en cache pour référence future et vitesse. Cependant, je rencontre des problèmes avec la mise à jour du fichier web.config (et dans certains cas plus effrayants si le pool d'applications est recyclé), il perd alors toute connaissance de certains assemblages, ce qui entraîne l'impossibilité de rendre une instance du type de module. Le débogage montre que l'assembly manquant n'existe pas littéralement dans la liste des assemblages de threads en cours. Pour contourner cela, j'ai ajouté une deuxième vérification qui est un peu sale mais récursif à travers les DLL du répertoire/bin/et vérifie que chacun existe dans la liste des assemblys. Si ce n'est pas le cas, il le charge en utilisant Assembly.Load et en corrigeant le problème de contexte grâce à 'Solving the Assembly Load Context Problem'. Cela fonctionnerait, mais il semble que (et je suis conscient que cela ne devrait pas être possible) certains projets ont toujours accès à l'assemblage manquant, par exemple mon projet Web réel plutôt que le cadre lui-même - et il se plaint que des références en double ont été ajoutées!
Quelqu'un a-t-il jamais entendu parler de ce genre de choses, ou a-t-il des idées sur la raison pour laquelle un assemblage disparaîtrait tout simplement d'un changement de configuration? A moins d'une solution, quelle est la solution la plus élégante pour obtenir tous les assemblages dans la poubelle à recharger? Il doit être tout en un "hit" afin que les visiteurs du site ne voient pas de différence autre qu'un petit retard, donc un fichier app_offline.htm est hors de question. Renommer par programme un DLL dans le chutier puis le renommer fonctionne, mais nécessite des autorisations "modify" pour le compte d'utilisateur IIS, qui est fou.
Merci pour les conseils que la communauté peut rassembler!
@ tags2k Il est possible de placer un lien pour télécharger le fichier dll qui fait le problème, pour le vérifier avec réflecteur, sur le point de l'erreur (aka sur GetTypeByName). – Aristos