Как получить расположение 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")
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. Другие указали на альтернативные методы определения местонахождения ассамблеи.
Если вы работаете с 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