对于集成测试,我想加载自定义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 Runtime不返回我的项目和/或程序集的位置,它返回运行时文件夹:
C:/Users/ben/.dnx/runtimes/dnx-clr-win-x86.1.0.0-rc1-update1/bin/Microsoft.Dnx.Loader.dll
如果我要求CodeBase或Executing / CallingAssembly,则行为相同。
" old"简单的C#项目和MsTest,我得到了预期的路径。
Environment.CurrentDirectory
在AppVeyor上不起作用,因为进程未在项目文件夹中启动,然后此命令返回另一个路径(已启动项目的路径)。
在这里使用相对路径的正确方法是什么?
答案 0 :(得分:19)
在DNX项目中,您必须添加依赖项Microsoft.Extensions.PlatformAbstractions
,然后才能使用
PlatformServices.Default.Application.ApplicationBasePath
如果没有额外的依赖性,甚至更容易:
使用System.AppContext.BaseDirectory
也许是因为未来的原生编译反射的东西是行不通的。
我认为System.AppContext.BaseDirectory
是最简单的解决方案。
PlatformServices.Default.Application
继承了IApplicationEnvironment
接口,默认情况下会在新的ASP.NET核心应用程序中注入该接口。