2010-08-02 8 views
1

La solution est-elle la seule possibilité d'utiliser des bibliothèques de GAC dans le code?Utilisation de GAC (Global Assembly Cache) - dans la façon dont il a été conçu

Assembly lib = Assembly.Load("MyLibrary, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=31f5625abd53197f"); 

Console.WriteLine(lib.GetType("MyClass").GetMethod("Start").Invoke(obj, null)); 

Je suis un peu confus - j'ai lu tout à fait beaucoup sur GAC et je sais comment signer un assembly, intall et désinstaller l'assemblage dans le GAC, mais ne sais pas comment l'utiliser, et comment il aide les programmeurs (sauf qu'il stocke différentes versions de la même bibliothèque en toute sécurité). J'aimerais pouvoir normalement créer des classes, sans être forcé d'invoquer les méthodes présentées ci-dessus.

Je ne veux pas de solutions de rechange telles que: "changer le registre de Windows" parce que je ne pense pas que GAC a été conçu pour de telles manipulations. Je veux une réponse simple: à quoi sert le GAC, est-ce que l'environnement d'exécution l'utilise d'une manière ou d'une autre?

Quel est le point d'utiliser GAC, quand le code devient vraiment moche et difficile à gérer? Ou peut-être qu'il me manque quelque chose? Peut-être que je devrais copier manuellement un assembly dans mon dossier local? Mais j'ai entendu dire que c'est aussi difficile à faire.

Répondre

4

Le GAC est là pour vous aider à avoir plusieurs versions de votre(c'est ce que la clé publique est pour - la prévention des conflits de noms) ensembles sont installés côte à côte, et à la disposition de toute la machine, non seulement votre répertoire d'application. Donc, oui, l'accès aux assemblages à partir du GAC en utilisant le numéro de version est à peu près exactement comme cela a été conçu pour le GAC. ;-)

btw: Vous ne devriez pas charger dynamiquement des choses quand vous n'avez pas à le faire. IOW: Si vous connaissez déjà le nom de la classe et la version de l'assembly, vous pouvez simplement référencer cet assembly et ignorer la pénalité plutôt dramatique liée au chargement dynamique d'un assembly, mais aussi à l'invocation de méthodes par réflexion. (Au lieu de les réutiliser par exemple via des interfaces ou des délégués)

+1

Alors pourquoi il est dit que GAC a aidé à résoudre le problème dit "DLL Hell", s'il n'y a que mes bibliothèques? Et quel est le but de mettre mes assemblées là si je ne sais pas comment les sortir et les réutiliser? Je dois toujours avoir une copie locale: /. Si je comprends bien, vous m'a conseillé de rechercher manuellement le fichier dans mon dossier Windows. L'utilisation par réflexion est-elle utilisée dans l'apliaction? Et un de plus: comment l'assembly mscorlib est-il lié à mes applications, puisqu'il réside dans GAC, mais je l'utilise normalement (pas par réflexion)? (désolé, je veux juste le comprendre; /) –

+1

DLL Hell se compose de bibliothèques installées à l'échelle mondiale qui sont mises à jour et ces mises à jour parfois briser d'autres applications nécessitant une autre version de la bibliothèque xyz. En outre, les DLL classiques ne sont accessibles que par leur nom de fichier, tandis que le GAC utilise également la version et la clé publique générées à partir de votre nom fort. Ainsi, même une bibliothèque avec le même nom ne sera pas en conflit avec la vôtre, étant donné que la clé publique diffère. - Pourquoi pensez-vous que vous avez besoin d'une copie locale lorsque vous avez installé vos assemblys dans le GAC? –

+1

@Marc, utilisez simplement la fenêtre Ajouter une référence pour ajouter une référence à un assembly que vous avez installé dans le GAC, et vous pouvez utiliser ses types comme tout autre assembly référencé, sans rien spécifier dans le code (tout comme vous utilisez divers System. * Des classes). –

1

Si votre assembly a été modifié ou GAC'd, alors l'application l'utilisera automatiquement si tout (hachage, etc.) correspond.

0

Si vous faites référence à l'assembly dans votre projet, vous pouvez l'utiliser comme une DLL normalement référencée qui n'est pas dans le GAC.