Как мне получить путь к сборке, в которой находится код? - PullRequest
719 голосов
/ 10 сентября 2008

Есть ли способ получить путь к сборке, в которой находится текущий код? Я не хочу путь к вызывающей сборке, только тот, который содержит код.

В основном мой модульный тест должен прочитать некоторые тестовые файлы XML, которые расположены относительно DLL. Я хочу, чтобы путь всегда разрешался правильно, независимо от того, запускается ли dll-тестирование из TestDriven.NET, графический интерфейс MbUnit или что-то еще.

Редактировать : Кажется, люди неправильно понимают, о чем я спрашиваю.

Моя библиотека тестов находится, скажем,

C: \ Проекты \ MyApplication \ daotests \ Bin \ Debug \ daotests.dll

и я бы хотел получить этот путь:

C: \ Проекты \ MyApplication \ daotests \ Bin \ Debug \

Три предложения пока что меня не подводят, когда я запускаю из MbUnit Gui:

  • Environment.CurrentDirectory дает c: \ Program Files \ MbUnit

  • System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location дает C: \ Documents and Настройки \ джордж \ Local Настройки \ Temp \ .... \ DaoTests.dll

  • System.Reflection.Assembly.GetExecutingAssembly().Location дает то же, что и предыдущий.

Ответы [ 27 ]

956 голосов
/ 12 ноября 2008

Я определил следующее свойство, так как мы часто используем его в модульном тестировании.

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        string path = Uri.UnescapeDataString(uri.Path);
        return Path.GetDirectoryName(path);
    }
}

Свойство Assembly.Location иногда дает некоторые забавные результаты при использовании NUnit (где сборки запускаются из временной папки), поэтому я предпочитаю использовать CodeBase, который дает путь в формате URI, тогда UriBuild.UnescapeDataString удаляет File:// в начале и GetDirectoryName изменяет его на обычный формат Windows.

301 голосов
/ 10 сентября 2008

Помогает ли это?

//get the full location of the assembly with DaoTests in it
string fullPath = System.Reflection.Assembly.GetAssembly(typeof(DaoTests)).Location;

//get the folder that's in
string theDirectory = Path.GetDirectoryName( fullPath );
295 голосов
/ 22 мая 2010

Это так просто:

var dir = AppDomain.CurrentDomain.BaseDirectory;
65 голосов
/ 02 апреля 2010

То же, что и ответ Джона, но чуть менее подробный метод расширения.

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

Теперь вы можете сделать:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

или, если вы предпочитаете:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();
44 голосов
/ 16 марта 2012

Единственное решение, которое работало для меня при использовании общих ресурсов CodeBase и UNC Network, было:

System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

Он также работает с обычными URI.

31 голосов
/ 10 сентября 2008

Это должно работать, если сборка не тень скопирована :

string path = System.Reflection.Assembly.GetExecutingAssembly().Location
14 голосов
/ 10 сентября 2008

Что по этому поводу:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
11 голосов
/ 16 июня 2010
AppDomain.CurrentDomain.BaseDirectory

работает с интерфейсом MbUnit.

11 голосов
/ 10 сентября 2008

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

Такой переключатель, вероятно, будет отличаться для каждого участника теста, конечно.

Рассматривали ли вы встраивание своих XML-данных в качестве ресурсов в тестовую сборку?

7 голосов
/ 30 августа 2016

Как насчет этого ...

string ThisdllDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

Тогда просто взломай то, что тебе не нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...