C# 运行编码UI时如何解析当前目录
我正在运行一个CodedUI测试,该测试引用了一个DLL,而该DLL引用了一种“配置”文件。运行测试时,当前目录将返回CodedUI放置我使用过的测试结果文件的目录C# 运行编码UI时如何解析当前目录,c#,dll,automation,coded-ui-tests,C#,Dll,Automation,Coded Ui Tests,我正在运行一个CodedUI测试,该测试引用了一个DLL,而该DLL引用了一种“配置”文件。运行测试时,当前目录将返回CodedUI放置我使用过的测试结果文件的目录 AppDomain.CurrentDomain.BaseDirectory 及 及 这些都给了我同样的道路 我需要的是获取DLL所在的路径,因为这是构建配置文件的地方 如果我正在调试或者只是在运行测试(显然),那么它所在的位置将发生变化,因此我不能使用它并向后导航或类似的操作 有没有其他方法可以获取您正在引用的DLL的位置 编辑:
AppDomain.CurrentDomain.BaseDirectory
及
及
这些都给了我同样的道路
我需要的是获取DLL所在的路径,因为这是构建配置文件的地方
如果我正在调试或者只是在运行测试(显然),那么它所在的位置将发生变化,因此我不能使用它并向后导航或类似的操作
有没有其他方法可以获取您正在引用的DLL的位置
编辑:
我正在引用的DLL中引用此配置文件。获取从中加载给定DLL的目录的最佳方法是对该程序集中定义的类型使用以下命令
var type = typeof(TypeInThatAssembly);
var path = Path.GetDirectory(type.Location);
CodeBase
和Location
属性通常返回相同的信息,但非常不同
- 代码库:它包含加载期间引用的程序集的位置
- 位置:这是从磁盘上实际加载程序集的位置
这些在使用卷影复制程序集(Asp.Net、xUnit等)的应用程序中可能有所不同。到目前为止,我找到测试dll原始路径的唯一位置是在测试上下文中的私有变量中。我最终使用反射来获取值并使其可用
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
public static string CodeBase(
TestContext testContext)
{
System.Type t = testContext.GetType();
FieldInfo field = t.GetField("m_test", BindingFlags.NonPublic | BindingFlags.Instance);
object fieldValue = field.GetValue(testContext);
t = fieldValue.GetType();
PropertyInfo property = fieldValue.GetType().GetProperty("CodeBase");
return (string)property.GetValue(fieldValue, null);
}
我使用它来获取正在运行的DLL的路径,然后使用它来运行我知道编译到测试所在位置的应用程序
如果有人找到更好的方法,请也告诉我。谢谢您的建议,但这与其他两个函数的路径相同。我可能需要进一步澄清。这不起作用的原因是,它被复制然后加载,而不是以其他方式加载到任何具有完整源代码的最终解决方案中?我还刚刚实现了嵌入式资源,以完成相同的任务,但这太棒了!我想知道为什么Microsoft决定以这种方式实施测试…我只是想让每个人都知道谁使用了它,返回的路径通常是您的生成位置,如果您正在运行使用从该路径返回的路径的测试,并且您试图同时执行新的生成,这些文件在运行时将被锁定,您可能会导致测试失败或编译失败或两者都失败。
var type = typeof(TypeInThatAssembly);
var path = Path.GetDirectory(type.Location);
using System.Reflection;
using Microsoft.VisualStudio.TestTools.UnitTesting;
public static string CodeBase(
TestContext testContext)
{
System.Type t = testContext.GetType();
FieldInfo field = t.GetField("m_test", BindingFlags.NonPublic | BindingFlags.Instance);
object fieldValue = field.GetValue(testContext);
t = fieldValue.GetType();
PropertyInfo property = fieldValue.GetType().GetProperty("CodeBase");
return (string)property.GetValue(fieldValue, null);
}