Подтвердить что ты не робот

Как получить местонахождение текущей DLL?

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

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

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

D:\Program Files\Microsoft Team Foundation Server 2010\Application Tier\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([email protected]"\AggregatorItems.xml")
4b9b3361

Ответ 1

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

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

Edit:

По-видимому, свойство Location работает некорректно при некоторых условиях (тестирование с использованием NUnit, TFS-экземпляра DLL, Outlook?) - в этом случае вы можете использовать свойство CodeBase.

Ответ 2

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

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.

Ответ 3

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

typeof(OneOfMyTypes).Assembly.CodeBase

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

Ответ 4

System.Reflection.Assembly.GetExecutingAssembly().Location

Ответ 5

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

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. Здесь я написал подробное описание здесь [Все предлагаемые ответы работают, когда разработчик может изменить код, чтобы включить требуемый фрагмент, но если вы хотите сделать это без изменения кода, вы можете использовать Process Explorer.

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

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