Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行编码UI时如何解析当前目录_C#_Dll_Automation_Coded Ui Tests - Fatal编程技术网

C# 运行编码UI时如何解析当前目录

C# 运行编码UI时如何解析当前目录,c#,dll,automation,coded-ui-tests,C#,Dll,Automation,Coded Ui Tests,我正在运行一个CodedUI测试,该测试引用了一个DLL,而该DLL引用了一种“配置”文件。运行测试时,当前目录将返回CodedUI放置我使用过的测试结果文件的目录 AppDomain.CurrentDomain.BaseDirectory 及 及 这些都给了我同样的道路 我需要的是获取DLL所在的路径,因为这是构建配置文件的地方 如果我正在调试或者只是在运行测试(显然),那么它所在的位置将发生变化,因此我不能使用它并向后导航或类似的操作 有没有其他方法可以获取您正在引用的DLL的位置 编辑:

我正在运行一个CodedUI测试,该测试引用了一个DLL,而该DLL引用了一种“配置”文件。运行测试时,当前目录将返回CodedUI放置我使用过的测试结果文件的目录

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);
    }