使用DNX项目确定当前路径

7

目标

为了进行集成测试,我想要加载自定义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 );
    }
}

问题

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

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

相当于请求CodeBase或Executing/CallingAssembly时行为相同。
对于“旧”简单的C#项目和MsTest,我得到了预期的路径。
由于进程不是在项目文件夹中启动的,因此在AppVeyor上无法使用“Environment.CurrentDirectory”,然后该命令返回另一个路径(已启动的项目的路径)。
问题:
在这里处理相对路径的正确方法是什么?
环境:
VS 2015更新1
DNX项目模板
xUnit配置
AppVeyor构建系统
1个回答

19

在 DNX 项目中,您需要添加依赖项 Microsoft.Extensions.PlatformAbstractions,然后可以使用 PlatformServices.Default.Application.ApplicationBasePath

或者更容易的方法是不需要增加其他依赖项:使用 System.AppContext.BaseDirectory

也许由于未来的本机编译,反射部分可能无法正常工作。 我认为System.AppContext.BaseDirectory 是最简单的解决方案。PlatformServices.Default.Application 继承了接口 IApplicationEnvironment,这个接口已经默认注入到新的 ASP.NET Core 应用程序中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接