Есть ли способ получить путь к сборке, в которой находится текущий код? Я не хочу путь к вызывающей сборке, только тот, который содержит код.
В основном мой модульный тест должен прочитать некоторые тестовые файлы XML, которые расположены относительно DLL. Я хочу, чтобы путь всегда разрешался правильно, независимо от того, запускается ли dll-тестирование из TestDriven.NET, через графический интерфейс MbUnit или что-то еще.
Изменить : Люди, кажется, неправильно понимают, что я спрашиваю.
Моя тестовая библиотека находится в скажем
C: \ Projects \ MyApplication \ daotests \ Bin \ Debug \ daotests.dll
и я хотел бы получить этот путь:
C: \ Projects \ MyApplication \ daotests \ Bin \ Debug \
Три предложения пока что подводят меня, когда я запускаю из MbUnit Gui:
Environment.CurrentDirectory
дает c: \ Program Files \ MbUnitSystem.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location
дает C: \ Documents and Settings \ george \ Local Settings \ Temp \ .... \ DaoTests.dllSystem.Reflection.Assembly.GetExecutingAssembly().Location
дает так же, как и предыдущий.
источник
packages
рядом с файлом sln. НО, когда вы компилируете и распространяете вещи, нет файла sln и каталога пакетов. Во время компиляции все необходимое (но не все) копируется в каталог bin. Лучше всего использовать сценарий пост-сборки, чтобы скопировать нужный файл.Ответы:
Я определил следующее свойство, так как мы часто используем его в модульном тестировании.
Это
Assembly.Location
свойство иногда дает некоторые забавные результаты при использовании NUnit (где сборки запускаются из временной папки), поэтому я предпочитаю использовать,CodeBase
который дает вам путь в формате URI, затемUriBuild.UnescapeDataString
удаляетFile://
в начале иGetDirectoryName
меняет его на обычный формат Windows ,источник
Это помогает?
источник
typeof(DaoTests).Assembly
Assembly.GetExecutingAssembly()
. Он «получает сборку, которая содержит код, который выполняется в данный момент» (из описания метода). Я использую это в моем AddIn " EntitiesToDTOs ". См. AssemblyHelper.cs для реального примера.Это так просто, как это:
источник
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
То же самое, что и ответ Джона, но чуть менее подробный метод расширения.
Теперь вы можете сделать:
или если вы предпочитаете:
источник
assembly
вместоAssembly.GetExecutingAssembly()
?Единственное решение, которое работало для меня при использовании общих ресурсов CodeBase и UNC Network, было:
Это также работает с обычными URI тоже.
источник
GetExecutingAssembly()
наGetCallingAssembly()
.AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory
. Первая часть предназначена для веб-приложений, а вторая - для других приложений.Это должно работать, если сборка не скопирована тенями :
источник
Что насчет этого:
источник
Я подозреваю, что реальная проблема заключается в том, что ваш тестовый бегун копирует вашу сборку в другое место. Во время выполнения нет никакого способа определить, откуда была скопирована сборка, но вы, вероятно, можете щелкнуть переключателем, чтобы сообщить исполнителю теста о том, что нужно запустить сборку, а не копировать ее в теневой каталог.
Конечно, такое переключение может быть разным для каждого участника теста.
Рассматривали ли вы встраивание своих XML-данных в качестве ресурсов в тестовую сборку?
источник
Assembly.CodeBase
.работает с интерфейсом MbUnit.
источник
Я считаю, что это будет работать для любого вида приложений:
источник
Насколько я могу судить, у большинства других ответов есть несколько проблем.
Правильный способ сделать это для дисковой (в отличие от веб-сборки ) сборки без GAC - использовать текущую исполняемую сборку.
CodeBase
свойство .Это возвращает URL (
file://
). Вместо того, чтобы возиться с манипуляциями со строками илиUnescapeDataString
, это можно преобразовать с минимальной суетой, используяLocalPath
свойствоUri
.источник
#
(EscapedCodeBase
работает, но EscapedCodeBase не работает, если путь содержит, например,%20
дословно (что является допустимой последовательностью символов в пути Windows)GetExecutingAssembly()
наGetCallingAssembly()
.Как насчет этого ...
Тогда просто взломай то, что тебе не нужно
источник
источник
Вот порт VB.NET кода Джона Сибли. Visual Basic не чувствителен к регистру, поэтому пара его имен переменных сталкивалась с именами типов.
источник
За все эти годы никто не упоминал об этом. Уловка, которую я узнал от удивительного проекта ApprovalTests . Хитрость заключается в том, что вы используете отладочную информацию в сборке, чтобы найти исходный каталог.
Это не будет работать в режиме RELEASE, ни с включенными оптимизациями, ни на компьютере, отличном от того, на котором он был скомпилирован.
Но это даст вам пути относительно места расположения файла исходного кода, из которого вы вызываете его
источник
Текущий каталог, в котором вы находитесь.
Если вы копируете файл .xml со сборкой, вы должны найти его.
или
источник
Environment.CurrentDirectory
работает, если вы используете отражение в классе задач MSBuild, где исполняемая сборка находится в GAC, а ваш код находится где-то еще.Я использовал Assembly.CodeBase вместо Location:
Это работает, но я больше не уверен, что это на 100% правильно. Страница по адресу http://blogs.msdn.com/suzcook/archive/2003/06/26/assembly-codebase-vs-assembly-location.aspx сказано:
«CodeBase - это URL-адрес места, где был найден файл, а Location - путь, по которому он был фактически загружен. Например, если сборка была загружена из Интернета, ее CodeBase может начинаться с« http: // » , но его Location может начинаться с "C: \". Если файл был скопирован теневым, Location будет путь к копии файла в каталоге теневого копирования. Также полезно знать, что CodeBase не гарантируется будет установлен для сборок в GAC. Однако расположение всегда будет устанавливаться для сборок, загруженных с диска ».
Вы можете использовать CodeBase вместо Location.
источник
Вы можете получить путь к корзине с помощью AppDomain.CurrentDomain.RelativeSearchPath.
источник
Все предложенные ответы работают, когда разработчик может изменить код для включения необходимого фрагмента, но если вы хотите сделать это без изменения кода, вы можете использовать Process Explorer.
В нем будут перечислены все выполняющиеся библиотеки в системе. Возможно, вам потребуется определить идентификатор процесса вашего работающего приложения, но обычно это не так уж сложно.
Я написал полное описание того, как сделать это для DLL внутри II - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -server /
источник
в приложении Windows Form вы можете просто использовать
Application.StartupPath
но для DLL и консольных приложений запоминать код гораздо сложнее ...
источник
источник
Вы получите неправильный каталог, если путь содержит символ «#». Поэтому я использую модификацию ответа Джона Сибли, которая представляет собой комбинацию UriBuilder.Path и UriBuilder.Fragment:
источник
Это то, что я придумал. Между веб-проектами юнит-тесты (nunit и resharper test runner) ; Я обнаружил, что это работает для меня.
Я искал код, чтобы определить, в какой конфигурации находится сборка
Debug/Release/CustomName
. Увы,#if DEBUG
. Так что, если кто-то может улучшить это !Не стесняйтесь редактировать и улучшать.
Получение папки приложения . Полезно для веб-корней, юнит-тестов, чтобы получить папку с тестовыми файлами.
Получение папки bin : полезно для выполнения сборок с использованием отражения. Если файлы копируются туда из-за свойств сборки.
источник
Это должно работать:
Я использую это для развертывания библиотек файлов DLL вместе с некоторым файлом конфигурации (это использовать log4net из файла DLL).
источник
fileMap
используется?Я нахожу свое решение адекватным для поиска местоположения.
источник
Я получил такое же поведение
NUnit
в прошлом. По умолчаниюNUnit
копирует вашу сборку во временный каталог. Вы можете изменить это поведение вNUnit
настройках:Возможно
TestDriven.NET
иMbUnit
GUI имеют одинаковые настройки.источник
Я использую это, чтобы получить путь к Bin Directory:
Вы получаете этот результат:
источник
Веб приложение?
источник