Определяне на текуща пътечка с DNX проекти

+6 гласа
52 прегледа
попитан 2016 май 11 в .NET от Nikoleta.V. (4,090 точки)

Цел 

За integration тестовете искам да заредя персонализирана XML конфигурация. Този XML е разположен в папка вътре в проекта за integration тестовете. 

За по-далечни цели иска мда ползвам новите DNX проекти.  

Локалните тестове работят добре. Проблемът е,че не мога да ползвам относителни пътища, защото заради тестовата система, информацията,която се пази за текущата директория , не е за директорията, в коят е проектът. Същия проблем имам с AppVeyor. 

Build agent-а се пуска в друга папка и информацията за относителния път е грешка и се чупи. Не е голяма изненада. 

Опитах да го оправя с този код: 

public abstract class IntegrationTestBase 

    public static string CurrentPath() 

    { 

        string codeBase = typeof (IntegrationTestBase).Assembly.Location; 

        UriBuilder uri = new UriBuilder( codeBase ); 

        string path = Uri.UnescapeDataString( uri.Path ); 

        return Path.GetDirectoryName( path ); 

    } 

Проблемът 

Проблемът е, че заради новия  DNX Runtime, това връща не локацията на проекта и/или assembly-то,а връща папката на runtime: 

C:/Users/ben/.dnx/runtimes/dnx-clr-win-x86.1.0.0-rc1-update1/bin/Microsoft.Dnx.Loader.dll 

По същия начин се държи ако поискам CodeBase или Executing/CallingAssembly. 

Със „стари“ просто C# проекти и MsTest си получавам очаквания път. 

Environment.CurrentDirectory не работи на AppVeyor,защото процесът не е пуснат в папката на проекта и тази команда връща друга пътечка. 

Въпрос 

Какъв е правилния начин да взема относителния път тук? 

Какво използвам 

  •     VS 2015 Update 1 
  •     DNX Project templates 
  •     xUnit configuration 
  •     AppVeyor build system 

1 отговор

0 гласа
отговорени 2016 май 12 от valeri.hristov (7,340 точки)
В DNX проектите трябва да добавиш зависимостта Microsoft.Extensions.PlatformAbstractions и след това можеш да ползваш PlatformServices.Default.Application.ApplicationBasePath

Или пък още по-лесно, без да ползваш зависимости- ползвай System.AppContext.BaseDirectory

По някаква причина reflection-а не работи. Мисля, че System.AppContext.BaseDirectory е най-лесният начин. PlatformServices.Default.Application имплементира IApplicationEnvironment интерфейса, който по подразбиране се инжектира в новите ASP.NET Core приложения.
...