5

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

AppDomain.CurrentDomain.BaseDirectory

System.Reflection.Assembly.GetExecutingAssembly().CodeBase

System.Reflection.Assembly.GetExecutingAssembly().Location

这些都给了我相同的道路

我需要的是获取 DLL 所在的路径,因为那是构建配置文件的位置。

如果我正在调试或者我只是在运行测试(显然),这将改变的位置,所以我不能使用它并向后导航或类似的东西。

还有其他方法可以获取您引用的 DLL 的位置吗?

编辑:

我从我引用的 DLL 中引用这个配置文件。

4

2 回答 2

3

到目前为止,我找到测试 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 的路径,然后使用它来运行我知道已编译到与测试所在位置相同的应用程序。

如果有人找到更好的方法来获得这个,也请告诉我。

于 2013-06-05T18:40:40.157 回答
1

获取加载给定 DLL 的目录的最佳方法是对该程序集中定义的类型使用以下内容。

var type = typeof(TypeInThatAssembly);
var path = Path.GetDirectory(type.Location);

CodeBaseand属性通常返回相同的Location信息,但非常不同

  • CodeBase:这包含在加载期间引用的程序集的位置
  • 位置:这是从磁盘上实际加载程序集的位置

这些在使用影子复制程序集(Asp.Net、xUnit 等)的应用程序中可能有所不同

于 2012-10-18T19:54:57.580 回答