2009-07-30 5 views
9

J'ai un service Web XML fonctionnel écrit en ASP.Net. Maintenant, j'ai besoin de référencer certains assemblages se trouvant dans un dossier spécifique, par ex. c:\NotMyCode
I ne pas souhaitez copier/dupliquer zillions de dll dans ce dossier dans mon dossier bin.Comment puis-je référencer des assemblages en dehors du dossier bin dans une application ASP.net?

J'ai essayé de conserver le CopyLocal=false pour les assemblys référencés dans le service Web. Cela s'est terminé dans une exception FileNotFound pour l'assembly. Lorsque je passe à CopyLocal=true, les DLL référencées sont copiées dans le dossier bin .. et cela fonctionne.

Donc ma question ici est: Comment est-ce que je fais référence aux assemblies qui ne se trouvent pas dans mon dossier bin ou un sous-dossier en dessous? Ai-je besoin de modifier certains fichiers de politique de sécurité quelque part? Je pense que je ne suis pas la première personne à vouloir faire quelque chose comme ça ... donc je suppose que quelqu'un a déjà résolu ce problème.

(je l'ai essayé usurper l'identité d'un utilisateur admin dans le panneau de configuration IIS ASP.net, mais ne fonctionnait pas non plus.)

Mise à jour: Impossible d'installer dans le GAC soit. Pour donner une analogie, ce service Web donne une vue simplifiée à une application tierce par exemple. Starteam. Je ne peux pas (ne devrait pas avoir .. ne veux pas ..) copier tous les binaires dans ce dossier dans le dossier bin ou l'installer dans le GAC

+0

J'ai le même problème et je ne trouve pas de solution! Avez-vous réussi à contourner cela? J'utilise .NET 3.5. Il semble que ce soit un bug similaire à http://support.microsoft.com/kb/812832. – dtroy

Répondre

0

Vous pourriez toujours mettre vos assemblages référencés dans le GAC, alors l'emplacement n'aurait pas d'importance. Vous pouvez installer le composant en le faisant glisser dans le GAC (C: \ windows \ assembly) ou en exécutant GACUtil.exe.

Cet article peut vous aider. Il décrit le "Best Practices for Assembly Loading". Dans un premier temps, j'ai pensé que vous pouviez utiliser l'élément <probing privatePath="bin\debug"/> dans runtime/assemblyBinding dans le fichier web.config, mais la vérification vous permettra uniquement de spécifier des sous-répertoires sous l'emplacement racine.

-1

Vous pouvez mettre en GAC et accéder à partir de là.

+0

s'il vous plaît lire la fin de ma question .. – Gishu

+0

Bonne réponse? ou mieux supprimé? – Kiquenet

0

Je pense que vous pouvez également référencer des chemins d'assemblage spécifiques dans le code.

AppDomain.CurrentDomain.AppendPrivatePath("C:\\NotMyCode"); 

Faire cela dans votre Global.asax Application_Start devrait faire l'affaire.

+0

AppendPrivatePath est obsolète, selon MSDN: http://msdn.microsoft.com/en-us/library/system.appdomain.appendprivatepath.aspx –

+0

Cela doit avoir été dans 3.5 .. Suis encore lourdement 2.0 malheureusement. PrivateBinPath alors .... Même pareil ... – davewasthere

14

Selon le MSDN documentation,

assemblées en dehors du répertoire Référencés racine de l'application doivent avoir des noms forts et doivent être soit installé dans le cache d'assembly global ou spécifié en utilisant l'élément <codeBase>.

Ainsi, il peut sembler que vous n'avez pas de chance. Voici ce que je vais essayer:

  1. Créez un NTFS junction point sous le répertoire de base de votre application qui pointe vers le répertoire contenant votre code partagé. C'est l'étape clé. Par exemple, dans le répertoire de base de votre application, exécutez linkd SharedCode c:\NotMyCode. Cela fait <yourappbase>\SharedCode être effectivement un alias pour c:\NotMyCode.
  2. Dites ASP.NET pour sonder les assemblages dans ce chemin, en utilisant un élément <probing>, référençant le point de jonction SharedCode. Comme c'est sous votre base d'application, cela devrait fonctionner. Sinon, utilisez AppDomainSetup.PrivateBinPath pour définir le chemin analysé pour les assemblages.

Je suis assez curieux de voir si cela fonctionne :-)

+0

+1 pour sournois .. ne connaissait pas linkd. Il a réussi à tromper Windows Explorer mais pas ASP.Net. ASP.net copie les fichiers binaires dans un emplacement temporaire à partir duquel ils sont exécutés. Ce qui est étrange, c'est que l'emplacement temporaire montre ces fichiers - cependant, FusionLogVw n'affiche pas d'entrée pour la résolution d'assemblage échouée. Mais le serveur répond avec un FileNotFound comme d'habitude ... – Gishu

+0

C'est un bummer :-( –

+1

on peut désactiver l'ombre coping dans le répertoire temporaire .. mais je n'aime pas la solution JUNCTION c'est comme bidouiller ... \ –

Questions connexes