J'ai un fichier de configuration que je dois charger dans le cadre de l'exécution d'une DLL que j'écris.
Le problème que j'ai est que l'endroit où j'ai mis la dll et le fichier de configuration n'est pas "l'emplacement actuel" lorsque l'application est en cours d'exécution.
Par exemple, je mets ici le fichier dll et xml:
D: \ Program Files \ Microsoft Team Foundation Server 2010 \ Application Tier \ Web Services \ bin \ Plugins
Mais si j'essaie de référencer le fichier xml (dans ma dll) comme ceci:
XDocument doc = XDocument.Load(@".\AggregatorItems.xml")
puis . \ AggregatorItems.xml se traduit par:
C: \ windows \ system32 \ inetsrv \ AggregatorItems.xml
Donc, j'ai besoin de trouver un moyen (j'espère) de savoir où se trouve la dll en cours d'exécution. Fondamentalement, je recherche ceci:
XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")
C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Assembly.GetExecutingAssembly().CodeBase
avez-vous!string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
La réflexion est votre amie, comme cela a été souligné. Mais vous devez utiliser la bonne méthode;
Assembly.GetEntryAssembly() //gives you the entrypoint assembly for the process. Assembly.GetCallingAssembly() // gives you the assembly from which the current method was called. Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined Assembly.GetAssembly( Type t ) // gives you the assembly in which the specified type is defined.
la source
Dans mon cas (traitant de mes assemblys chargés [en tant que fichier] dans Outlook):
typeof(OneOfMyTypes).Assembly.CodeBase
Notez l'utilisation de
CodeBase
(nonLocation
) sur leAssembly
. D'autres ont indiqué des méthodes alternatives pour localiser l'assemblage.la source
la source
Si vous travaillez avec une application asp.net et que vous souhaitez localiser des assemblys lors de l'utilisation du débogueur, ils sont généralement placés dans un répertoire temporaire. J'ai écrit cette méthode pour aider avec ce scénario.
private string[] GetAssembly(string[] assemblyNames) { string [] locations = new string[assemblyNames.Length]; for (int loop = 0; loop <= assemblyNames.Length - 1; loop++) { locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault(); } return locations; }
Pour plus de détails, consultez ce billet de blog http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/
Si vous ne pouvez pas modifier le code source ou le redéployer, mais que vous pouvez examiner les processus en cours d'exécution sur l'ordinateur, utilisez Process Explorer. J'ai écrit une description détaillée ici .
Il répertorie toutes les DLL en cours d'exécution sur le système, vous devrez peut-être déterminer l'ID de processus de votre application en cours d'exécution, mais ce n'est généralement pas trop difficile.
J'ai écrit une description complète de la façon de procéder pour une dll dans IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -serveur/
la source