2009-12-10 2 views
1

Je suis désolé si ce sont des questions stupides, mais j'ai passé deux jours sur ce sujet et je n'arrive pas à le faire fonctionner. Voici ce que je l'ai fait:Impossible d'accéder à l'assembly installé dans le GAC

  1. Créer un nouveau projet de bibliothèque de classes
  2. Ajout d'une méthode simple sayHi() qui retourne une chaîne
  3. Dans les propriétés projet vérifiés « signer l'assemblée » et utilisé un nom fort fichier clé
  4. l'application et Compilé copié la DLL à c: \ windows \ ensembles (et j'ai aussi essayé d'utiliser l'outil gacutil avec des résultats similaires)
  5. ajouté ce qui suit machine.config <compilation><assemblies><add assembly="gacTestClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31418215e131202e" />. Cela fonctionne très bien, car si je mal orthographe le nom de l'assembly, toute application .net échouera et se plaindre de cette ligne.
  6. En utilisant le visualiseur de cache d'assembly dans l'outil de configuration de l'infrastructure .NET, je peux voir l'assembly dans le cache.
  7. Maintenant, lorsque j'essaie d'utiliser cela, mon application échoue lorsque je fais soit using gacTestClass ou gacTestClass.gacTest.sayHi(). J'ai une erreur indiquant que le type ou l'espace de noms n'a pas pu être trouvé.

Toute aide est appréciée.

EDIT:

Ok, j'ai suivi une suggestion et je vais essayer de faire ce travail avec web.config, plutôt que machine.config.

J'ai ajouté ce qui suit à mon web.config <compilation><assemblies><add assembly="gacTestClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31418215e131202e" /> et vérifié que cela fonctionne en mal orthographiant le nom et en voyant l'application échouer. Maintenant, lorsque j'essaie d'ajouter using gacTestClass en haut de mon fichier .cs, j'obtiens une erreur indiquant que le type ou l'espace de noms est introuvable.

Juste au cas où, voici le code pour la gacTestClass la

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 
[assmbly:AssemblyKeyFile("sayHi.snk")] 
namespace gacTestClass { 
    public class gacTest { 
     public string sayHi() { 
      return "Hello there!"; 
     } 
    } 
} 
+1

Je pense que même si l'assemblage est dans GAC, vous devrez ajouter une référence. L'avantage est que l'assemblage n'a besoin d'être copié dans aucun dossier. –

+1

Pouvez-vous copier/coller le message d'erreur particulier que vous obtenez? Si vous ajoutez l'assembly à machine.config ou à web.config, vous ne devez PAS ajouter de référence dans votre application. – sestocker

+0

@sestocker: Si son application n'est pas ASP.Net, il le fera. – SLaks

Répondre

3

EDIT: Essayez un clic droit sur votre projet, cliquez sur Ajouter une référence, et en ajoutant votre fichier DLL.

En général, vous ne devez jamais modifier machine.config.

+0

Pourquoi pas? J'ai plusieurs applications, et je ne veux pas avoir à ajouter une référence chaque fois qu'une nouvelle application est installée sur le serveur. – PBG

+1

Parce que si, l'année prochaine, vous obtenez un nouveau serveur, ou si vous passez à .Net 4, vous aurez probablement oublié de re-modifier 'machine.config'. – SLaks

+0

Aussi, de sorte que plusieurs applications de personnes différentes puissent vivre sur le même serveur. ** N'utilisez pas l'état global pour résoudre un problème local. ** http://blogs.msdn.com/oldnewthing/archive/2008/12/11/9193695.aspx http://blogs.msdn.com/oldnewthing /archive/2009/10/15/9907370.aspx – SLaks

4

Essayez ceci:

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="Namespace" publicKeyToken="token" culture="neutral" /> 
    <bindingRedirect oldVersion="1.0.0.0" newVersion="1.1.0.0" /> 
    </dependentAssembly> 
</assemblyBinding></runtime> 

Déplacer la section de compilation de la machine.config à votre web.config et lui donner un essai. Cela devrait fonctionner correctement dans le fichier machine.config mais je suppose que si vous effectuez un assemblage GAC, de nombreuses applications l'utiliseront. Vous souhaiterez que chaque application puisse choisir la version de la DLL à utiliser (pour faciliter la mise à niveau).

Aussi, semble évident, mais assurez-vous que la méthode (gacTestClass.gacTest.sayHi()) que vous essayez d'accéder est publique.

+0

J'ai essayé de déplacer le code vers web.config, mais cela n'a pas fonctionné. Oui, l'assembly est GACed, et la classe et la méthode sont publiques. – PBG

+0

Où cela se passe-t-il? – PBG

+0

Prenez cela en arrière - je pense que c'est sharepoint seulement ... – sestocker

Questions connexes