2009-05-14 3 views
42

Как мне получить путь к текущей сборке? Мне нужно получить данные из некоторых путей относительно местоположения hte current assembly (.dll).Получение пути текущей сборки

Я думал, что кто-то сказал мне использовать пространство имен отражения, но я ничего не могу найти там.

+1

Assembly.GetExecutingAssembly(). Location – RichieHindle

ответ

72

Вы можете использовать:

string path = (new System.Uri(Assembly.GetExecutingAssembly().CodeBase)).AbsolutePath; 

Некоторые предложения в комментариях, чтобы передать, что через System.Uri.UnescapeDataString(от vvnurmi) чтобы гарантировать, что любой процент кодирования обрабатывается, и использовать Path.GetFullpath(от TrueWill), чтобы гарантировать, что путь находится в стандартной форме Windows (вместо того, чтобы иметь косые черты вместо обратных косых черт). Вот пример того, что вы получите на каждом этапе:

string s = Assembly.GetExecutingAssembly().CodeBase; 
Console.WriteLine("CodeBase: [" + s + "]"); 
s = (new Uri(s)).AbsolutePath; 
Console.WriteLine("AbsolutePath: [" + s + "]"); 
s = Uri.UnescapeDataString(s); 
Console.WriteLine("Unescaped: [" + s + "]"); 
s = Path.GetFullPath(s); 
Console.WriteLine("FullPath: [" + s + "]"); 

выход, если мы бежим C:\Temp\Temp App\bin\Debug\TempApp.EXE:

 
CodeBase: [file:///C:/Temp/Temp App/bin/Debug/TempApp.EXE] 
AbsolutePath: [C:/Temp/Temp%20App/bin/Debug/TempApp.EXE] 
Unescaped: [C:/Temp/Temp App/bin/Debug/TempApp.EXE] 
FullPath: [C:\Temp\Temp App\bin\Debug\TempApp.EXE] 
+7

Я бы рекомендовал вызывать Path.GetFullPath, чтобы превращать косую черту в обратную косую черту. Вы можете получить странное поведение из Assembly.LoadFile (например, типы, не приравнивающие) при использовании косой черты. – TrueWill

+3

В чем преимущество/цель использования этого вместо '.Location'? (Я подозреваю, что должна быть причина, но меня это не устраивает.) – 2011-04-03 18:34:16

+4

@pst: В зависимости от среды, местоположение может быть неправильным, так как теневое копирование может «переместить» сборку перед выполнением. –

44
+13

+1 для ссылок на документацию.8-) – RichieHindle

+0

Это дает расположение mscorlib, а не вашей сборки, когда вызывается из теста модуля MSTest. –

6

Просто чтобы понять:

Assembly.GetExecutingAssembly().Location 
+0

+1: Сомнение плохо. – RichieHindle

2

Я предпочитаю

new System.Uri(Assembly.GetExecutingAssembly().EscapedCodeBase).LocalPath; 

EscapedCodeBase охватывает ситуацию, когда ваш локальный путь может иметь недопустимый URI полукокса в нем (см https://stackoverflow.com/a/21056435/852208)

LocalPath включает полный путь как для локальных путей, так и для непустых путей, где AbsolutePath отключает «\\ сервер»

Смежные вопросы