2009-10-23 3 views
2

Assembly.Location donne un chemin uni à l'assemblage. Malheureusement, cette option est vide lors de l'exécution dans un environnement masqué, tel qu'un test unitaire ou ASP.NET. Cependant, la propriété Codebase est disponible et fournit un URI qui peut être utilisé à la place. Dans quels cas il ne renvoie aucun URI commençant par file:///? Ou en d'autres termes: quels sont les cas dans lesquels cela ne fonctionnera pas ou retournera des résultats inutilisables?Assembly.CodeBase: quand n'est-ce pas un fichier URI?

Assembly assembly = GetType().Assembly;  
Uri codeBaseUri = new Uri(assembly.CodeBase); 
string path = codeBaseUri.LocalPath; 

Répondre

3

Il est possible de charger les assemblages directement sur HTTP, comme dans un déploiement ClickOnce:

Assembly assembly = Assembly.LoadFrom("http://server/app.dll"); 
Uri codeBaseUri = new Uri(assembly.CodeBase); 
Debug.Assert(codeBaseUri.Scheme == "http"); 
Debug.Assert(codeBaseUri.LocalPath == ""); 
Debug.Assert(assembly.Location == ""); 
+0

Je n'ai jamais utilisé cela directement, bien que j'aie déjà utilisé ClickOnce. Vous avez probablement raison, mais que se passe-t-il si mon code est à l'intérieur de votre app.dll et que le fichier app.dll a été téléchargé comme vous l'avez décrit. Qu'est-ce que je reçois dans le chemin? % LOCALAPPDATA% \ Apps \ 2.0 \ quelque chose? Ou cela échouerait-il complètement? Le chemin –

+0

(c'est-à-dire Uri.LocalPath) est vide sauf si l'URI contient un lien file: //. De même, assembly.Location est également vide. Je pensais avoir une autre propriété pour trouver l'emplacement copié par l'ombre (qui est garanti être un vrai fichier), mais je ne peux pas le voir tout de suite. –

Questions connexes