Как получить расположение DLL в настоящее время выполняется?



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



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



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




D:Program файлыMicrosoft Team Foundation Server 2010Application TierWeb ServicesbinPlugins




но если я попытаюсь сослаться на xml-файл (в моей dll) вот так:



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


затем .AggregatorItems.xml переводится как:




C:windowssystem32inetsrvAggregatorItems.xml




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



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

5 ответов:

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

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

Edit:

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

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

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.

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

typeof(OneOfMyTypes).Assembly.CodeBase

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

System.Reflection.Assembly.GetExecutingAssembly().Location

Если вы работаете с 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/

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

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

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

Comments

    Ничего не найдено.