Як отримати розташування DLL, що виконується на даний момент?


93

У мене є конфігураційний файл, який мені потрібно завантажити як частину виконання 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(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

Відповіді:


137

Ви шукаєте System.Reflection.Assembly.GetExecutingAssembly()

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

Примітка:

.LocationВластивість повертає розташування запущеного файлу DLL.

За деяких умов DLL копіюється в тіні перед виконанням, і .Locationвластивість поверне шлях до копії. Якщо вам потрібен шлях до вихідної DLL, використовуйте Assembly.GetExecutingAssembly().CodeBaseзамість цього властивість.

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


8
На жаль! Це повертаєтьсяC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Ваккано

23
Ах! Але Assembly.GetExecutingAssembly().CodeBaseє!
Ваккано

2
CodeBase дав мені файл: \\ c: \ myassemblypath, що дивно
Метт

10
@Matt використовує новий Uri (Assembly.GetExecutingAssembly (). CodeBase) .LocalPath, щоб отримати справжнє ім'я
Ларрі

2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Мартін Коннелл

36

Відображення - це ваш друг, як уже зазначалося. Але потрібно використовувати правильний метод;

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.

16

У моєму випадку (стосується моїх збірок, завантажених [як файл] до Outlook):

typeof(OneOfMyTypes).Assembly.CodeBase

Зверніть увагу на використання CodeBase(не Location) на Assembly. Інші вказували на альтернативні методи визначення місця розташування зборів.



1

Якщо ви працюєте з додатком 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 -сервер /

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.