Как узнать местоположение исполняемой DLL в данный момент? - PullRequest
71 голосов
/ 22 января 2011

У меня есть файл конфигурации, который мне нужно загрузить как часть выполнения DLL, которую я пишу.

У меня проблема в том, что место, куда я помещаю файл dll и файл конфигурации, не«текущее местоположение», когда приложение запущено.

Например, я поместил файл dll и xml здесь:

D: \ Program Files \ Microsoft Team Foundation Server 2010 \ ApplicationУровень \ Web Services \ bin \ Plugins

Но если я попытаюсь сослаться на XML-файл (в моей dll) следующим образом:

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

, то . \ AggregatorItems.xml переводится в:

C: \ windows \ system32 \ inetsrv \ AggregatorItems.xml

Итак, мне нужно найти способ (я надеюсь)знать, где находится DLL, которая в настоящее время выполняется.В основном я ищу это:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

Ответы [ 5 ]

106 голосов
/ 22 января 2011

Вы ищете System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

Примечание:

Свойство .Location возвращает местоположение текущегозапущенный файл DLL.

При некоторых условиях перед выполнением библиотека выполняет теневое копирование, а свойство .Location возвращает путь к копии.Если вы хотите указать путь к исходной DLL, используйте вместо этого свойство Assembly.GetExecutingAssembly().CodeBase.

.CodeBase содержит префикс (file:\), который вам может потребоваться удалить.

32 голосов
/ 22 января 2011

Отражение - твой друг, как уже указывалось. Но вам нужно использовать правильный метод;

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.
14 голосов
/ 22 января 2011

В моем случае (при работе с моими сборками, загруженными [в виде файла] в Outlook):

typeof(OneOfMyTypes).Assembly.CodeBase

Обратите внимание на использование CodeBase (не Location) на Assembly. Другие указали на альтернативные методы определения местоположения сборки.

4 голосов
/ 22 января 2011
System.Reflection.Assembly.GetExecutingAssembly().Location
1 голос
/ 02 мая 2015

Если вы работаете с приложением asp.net и хотите использовать сборки при использовании отладчика, они обычно помещаются в некоторый временный каталог. Я написал этот метод, чтобы помочь с этим сценарием.

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;
}

Подробнее см. В этом блоге http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

Если вы не можете изменить исходный код или выполнить повторное развертывание, но вы можете проверить запущенные процессы на компьютере, используйте Process Explorer. Я написал подробное описание здесь .

В нем будут перечислены все выполняющиеся библиотеки в системе, возможно, вам потребуется определить идентификатор процесса вашего работающего приложения, но обычно это не так уж сложно.

Я написал полное описание того, как сделать это для DLL внутри IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...