2015-01-05 4 views
2

У меня есть dll, который зависит от некоторых внешних файлов. У меня есть относительные пути (относительно местоположения dll) к этим файлам.Получить абсолютный путь относительно местоположения DLL

Мне нужно иметь возможность загружать/читать эти файлы из DLL.

Чтобы найти абсолютный путь к файлам я использую:

System.IO.Path.GetFullPath(filePath); 

Казалось, что работает, но я обнаружил, что это на самом деле возвращает путь относительно «текущего каталога». Я обнаружил, что текущий каталог изменяется в какой-то момент из местоположения dll (и, возможно, даже не будет пути к dll).

Что является самым простым способом получить абсолютный путь к файлам относительно DLL из кода, запущенного в DLL?

Я собирался использовать следующее, но обнаружил, что она возвращает путь к EXE, который загрузил DLL, а не DLL путь:

AppDomain.CurrentDomain.BaseDirectory 
+2

Я думаю, вы можете получить имя файла из codebase: 'Assembly.GetExecutingAssembly(). CodeBase' (если вызывается внутри функции в dll of the course) –

+0

Да. Это сработало для меня. По крайней мере, он находит полный путь к DLL (с ​​файлом: /// preappended to the string). Введите его как ответ, и я буду отмечать его как правильное. –

+0

Обратите внимание, что 'GetFullPath' вычисляет абсолютный путь, основанный на * current * каталоге, который может или не может совпадать с местоположением EXE, а также может изменяться во время выполнения приложения. –

ответ

2

GetFullPath всегда предполагает относительно текущего каталога, если вы укажите абсолютный путь. Вы должны просто вручную объединить свой путь сборки с вашим относительным путем. Затем вы можете нормализовать результат, чтобы получить чистый путь.

string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
string filePathRelativeToAssembly = Path.Combine(assemblyPath, @"..\SomeFolder\SomeRelativeFile.txt"); 
string normalizedPath = Path.GetFullPath(filePathRelativeToAssembly); 

например. Если место сборки «C: \ Test \ MyAssembly.dll», то вы получите этот

assemblyPath = "C:\Test" 
filePathRelativeToAssembly = "C:\Test\..\SomeFolder\SomeRelativeFile.txt" 
normalizedPath = "C:\Test\SomeFolder\SomeRelativeFile.txt" 

Кроме того, если вы прошли в абсолютном пути в качестве второй части Path.Combine он все равно будет делать правильную вещь.

string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
string filePathRelativeToAssembly = Path.Combine(assemblyPath, @"C:\AbsoluteFile.txt"); 
string normalizedPath = Path.GetFullPath(filePathRelativeToAssembly); 

даст вам

filePathRelativeToAssembly = "C:\AbsoluteFile.txt" 
normalizedPath = "C:\AbsoluteFile.txt" 
+0

Отлично. Благодарю. В итоге я использовал что-то похожее на то, что вы предложили. –

1

Чтобы получить полный путь к длл кодовую, вы можете использовать этот код:

string codeBase = Assembly.GetExecutingAssembly().CodeBase; 

Вы можете дополнительно чистый этот путь с помощью uriBuilder :

UriBuilder uri = new UriBuilder(codeBase); 
string cleanFullPath = Uri.UnescapeDataString(uri.Path); 
+0

Вопрос был «Какой самый простой способ получить абсолютный путь к файлам относительно DLL из кода, запущенного в DLL?» поэтому я не уверен, что это именно то, что было запрошено. Может потребоваться разъяснение от Джорджа. –

+0

Спасибо за помощь. –