Как мне получить путь к сборке, в которой находится код? - 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 ]

1 голос
/ 29 октября 2018

Вы получите неправильный каталог, если путь содержит символ «#». Поэтому я использую модификацию ответа Джона Сибли, которая представляет собой комбинацию UriBuilder.Path и UriBuilder.Fragment:

public static string AssemblyDirectory
{
    get
    {
        string codeBase = Assembly.GetExecutingAssembly().CodeBase;
        UriBuilder uri = new UriBuilder(codeBase);
        //modification of the John Sibly answer    
        string path = Uri.UnescapeDataString(uri.Path.Replace("/", "\\") + 
          uri.Fragment.Replace("/", "\\"));
        return Path.GetDirectoryName(path);
     }
}
0 голосов
/ 21 декабря 2011

Я использую это, чтобы получить путь к каталогу бинов:

var i = Environment.CurrentDirectory.LastIndexOf(@"\");
var path = Environment.CurrentDirectory.Substring(0,i); 

Вы получите этот результат:

"c: \ users \ ricooley \ Documents \ visual studio 2010 \ Projects \ Windows_Test_Project \ Windows_Test_Project \ Bin "

0 голосов
/ 12 июня 2013

Это должно работать:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
Assembly asm = Assembly.GetCallingAssembly();
String path = Path.GetDirectoryName(new Uri(asm.EscapedCodeBase).LocalPath);

string strLog4NetConfigPath = System.IO.Path.Combine(path, "log4net.config");

Я использую это для развертывания библиотек файлов DLL вместе с некоторым файлом конфигурации (это для использования log4net из файла DLL).

0 голосов
/ 03 июля 2013

Это то, что я придумал. Между веб-проектами юнит-тесты (nunit и resharper runner) ; Я обнаружил, что это работает для меня.

Я искал код, чтобы определить, в какой конфигурации находится сборка, Debug/Release/CustomName. Увы, #if DEBUG. Так что, если кто-то может улучшить это !

Не стесняйтесь редактировать и улучшать.

Получение папки приложения . Полезно для веб-корней, юнит-тестов, чтобы получить папку с тестовыми файлами.

public static string AppPath
{
    get
    {
        DirectoryInfo appPath = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory);

        while (appPath.FullName.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
                || appPath.FullName.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            appPath = appPath.Parent;
        }
        return appPath.FullName;
    }
}

Получение папки bin : Полезно для выполнения сборок с использованием отражения. Если файлы копируются туда из-за свойств сборки.

public static string BinPath
{
    get
    {
        string binPath = AppDomain.CurrentDomain.BaseDirectory;

        if (!binPath.Contains(@"\bin\", StringComparison.CurrentCultureIgnoreCase)
            && !binPath.EndsWith(@"\bin", StringComparison.CurrentCultureIgnoreCase))
        {
            binPath = Path.Combine(binPath, "bin");
            //-- Please improve this if there is a better way
            //-- Also note that apps like webapps do not have a debug or release folder. So we would just return bin.
#if DEBUG
            if (Directory.Exists(Path.Combine(binPath, "Debug"))) 
                        binPath = Path.Combine(binPath, "Debug");
#else
            if (Directory.Exists(Path.Combine(binPath, "Release"))) 
                        binPath = Path.Combine(binPath, "Release");
#endif
        }
            return binPath;
    }
}
0 голосов
/ 18 июня 2014

Веб-приложение?

Server.MapPath("~/MyDir/MyFile.ext")
0 голосов
/ 23 сентября 2015

Я считаю мое решение подходящим для поиска местоположения.

var executingAssembly = new FileInfo((Assembly.GetExecutingAssembly().Location)).Directory.FullName;
0 голосов
/ 30 сентября 2015

У меня такое же поведение в NUnit в прошлом. По умолчанию NUnit копирует вашу сборку во временный каталог. Вы можете изменить это поведение в настройках NUnit:

enter image description here

Может быть, TestDriven.NET и MbUnit GUI имеют одинаковые настройки.

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