确定DNX项目的当前路径

Ben*_*Ben 7 c# asp.net xunit appveyor dnx

目标

对于集成测试,我想加载自定义XML配置.此XML位于集成测试项目内的文件夹中.

对于进一步的目标,我想使用新的DNX项目.我知道他们还在预览中.

本地测试工作正常.现在的问题是,我不能使用相对路径,因为测试系统当前目录信息不是我项目的项目文件夹.与AppVeyor相同的问题.

构建代理程序在另一个文件夹中启动,因此相对路径信息错误并失败.这里不要惊讶.

我试图用这个片段来解决这个问题:

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

问题

这里的问题是:由于新的DNX Runtime不返回我的项目和/或程序集的位置,它返回运行时文件夹:

C:/Users/ben/.dnx/runtimes/dnx-clr-win-x86.1.0.0-rc1-update1/bin/Microsoft.Dnx.Loader.dll
Run Code Online (Sandbox Code Playgroud)

如果我要求CodeBase或Executing/CallingAssembly,则行为相同.

使用"旧的"简单C#项目和MsTest,我得到了预期的路径.

Environment.CurrentDirectory 在AppVeyor上不起作用,因为进程未在项目文件夹中启动,然后此命令返回另一个路径(已启动项目的路径).

在这里使用相对路径的正确方法是什么?

环境

  • VS 2015 Update 1
  • DNX项目模板
  • xUnit配置
  • AppVeyor构建系统

Ben*_*Ben 19

在DNX项目中,您必须添加依赖项Microsoft.Extensions.PlatformAbstractions,然后才能使用 PlatformServices.Default.Application.ApplicationBasePath

或者更容易,没有额外的依赖:使用 System.AppContext.BaseDirectory

也许是因为未来的原生编译反射的东西是行不通的.我认为这System.AppContext.BaseDirectory是最简单的解决方案. PlatformServices.Default.Application继承IApplicationEnvironment默认情况下在新的ASP.NET Core应用程序中注入的接口.