Как получить путь к сборке, в которой находится код?
Есть ли способ получить путь к сборке, в которой находится текущий код? Мне не нужен путь к вызывающей сборке, только к той, которая содержит код.
В основном мой юнит-тест должен читать некоторые тестовые xml-файлы, расположенные относительно dll. Я хочу, чтобы путь всегда определялся правильно, независимо от того, запускается ли тестовая dll из TestDriven.NET, графического интерфейса MbUnit или чего-то еще.
Edit: Похоже, люди неправильно понимают, о чем я спрашиваю.
Моя тестовая библиотека находится, скажем, в каталоге
C:\projects\myapplication\daotests\bin\Debug\daotests.dll
и я хотел бы получить этот путь:
C:\projects\myapplication\daotests\bin\Debug\
Все три предложенных варианта не работают при запуске из MbUnit Gui:
-
Environment.CurrentDirectory
дает c:\Program Files\MbUnit. -
System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
дает C:\Documents and Настройки\георгий\Локальный Settings\Temp\ ....\DaoTests.dll -
System.Reflection.Assembly.GetExecutingAssembly().Location
дает то же самое, что и предыдущий.
Я'вэ определено следующее свойство, как мы используем это часто в модульном тестировании.
На Ассамблеи.Местоположение иногда дает забавные результаты при использовании Нанит (где сборки выполняются из временной папки), поэтому я предпочитаю использовать
кода
, который дает вам путь в формате URI, тоUriBuild.UnescapeDataString
удаляетфайл://
в начале иGetDirectoryName
меняет его на нормальный формат Windows.Помогает ли это?
Это's, как просто, как это:
Так же, как Джон'ы ответ, но немного менее многословный способ расширения.
Теперь вы можете сделать:
или, если вы предпочитаете:
Единственное решение, которое работает для меня, когда через codebase и сетевых общих папок UNC был:
Он также работает с нормальных ресурсов.
Это должно работать, если только сборка не была теневым копированием:
Что по этому поводу:
работает с графическим MbUnit.
Я подозреваю, что реальная проблема здесь заключается в том, что ваш тест бегун копирование сборки в другое место. Там's нет пути во время выполнения, чтобы сказать, где сборка была скопирована с, но можно, наверное, повернуть выключатель, чтобы рассказать тестов для выполнения сборки, из которого он и не копировать его в тень каталог.
Такой переход, вероятно, будет отличаться для каждого теста, конечно.
Рассматривали ли вы внедрение XML-данных в качестве ресурсов внутри тестовой сборки?
Насколько я могу судить, большинство других ответов есть несколько проблем.
Правильный способ сделать это для дисковый (в отличие от веб-основе), не GACed сборка заключается в использовании в данный момент сборке'собственность с
кода
.Это возвращает url (
файл://
). Вместо того, чтобы возиться с строковые манипуляции илиUnescapeDataString
, это может быть преобразовано с минимальными усилиями, используяLocalPath
собственностьУри
.Вот VB.NET порт Джон Циблы's код. В Visual Basic-это не чувствительны к регистру, поэтому пару его имена переменных были столкновения с именами типа.
Как насчет этого ...
Тогда просто отрезать то, что вам не нужно
За все эти годы, никто на самом деле упоминал об этом. Трюк я узнал от крутые project ApprovalTests](https://github.com/approvals/ApprovalTests.Net/blob/master/ApprovalUtilities/Utilities/PathUtilities.cs). Хитрость заключается в том, что вы используете отладочную информацию в сборку, чтобы найти оригинальный каталог.
Это не будет работать в режиме release, ни с включенной оптимизацией, ни на машине, отличный от того, который был составлен на.
Но это будет Вам пути, относительно расположения файла с исходным кодом, вы называете его из
Текущий каталог, в котором вы существуете.
Если вы скопируете .xml-файл вместе со сборкой, вы должны найти его.
или
Я'вэ использовал сборку.Кода вместо местоположение:
Это'ов работала, но я'м не уверен, что это 100% правильно. Страницы http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx говорит:
"в codebase-это URL-адрес места, где этот файл был найден, в то время как расположение-это путь, где он был на самом деле заряжен. Например, если сборка была загружена из интернета, ее код может начинаться с "http://", но его расположение может начать с "C:\". Если файл был теневого копирования, расположение будет путь к копии файла в теневой копии реж. Это также хорошо знать, что кодовая база не гарантируется, комплект для сборки в GAC. Местоположение всегда будет вместе с Набор для сборки, загруженные с диска.&и quot;
Вы may хотите использовать кода, вместо местоположения.
Я считаю, что это будет работать для любого вида применения:
Вы можете получить бин пути Домен приложений.CurrentDomain.RelativeSearchPath
в виде приложения Windows, вы можете просто использовать приложение.StartupPath`
но для библиотек и консольных приложений коде гораздо сложнее вспомнить...
Все предложенные ответы, когда разработчик может изменять код, чтобы включить нужный фрагмент, но если вы хотели сделать это, не меняя любой код, который вы могли бы использовать процесс Explorer.
Это будет список всех выполнения библиотек DLL в системе, вам может понадобиться, чтобы определить идентификатор процесса запущенного приложения, но это обычно не слишком трудно.
Я'вэ написано полное описание как это сделать для DLL внутри второй - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web-server/