是否有方法获取当前代码所在程序集的路径?我不需要调用程序集的路径,只需要包含代码的路径。

基本上,我的单元测试需要读取一些相对于dll的xml测试文件。无论测试dll是否从TestDriven运行,我都希望该路径始终能够正确解析。NET, MbUnit GUI或者别的什么。

编辑:人们似乎误解了我的问题。

我的测试库位于say

C: \ \项目myapplication \ daotests \ bin \ \ daotests.dll调试

我想得到这条路径:

C: \ \ myapplication \ daotests \ bin \项目调试\

到目前为止,当我从MbUnit Gui运行时,这三个建议都失败了:

环境。CurrentDirectory 给出c:\Program Files\MbUnit System.Reflection.Assembly.GetAssembly .Location (typeof (DaoTests)) 给出C:\Documents和 乔治\ \本地设置 设置\ Temp \…\ DaoTests.dll .Location System.Reflection.Assembly.GetExecutingAssembly () 给出与前面相同的结果。


当前回答

与John的答案相同,但扩展方法略少啰嗦。

public static string GetDirectoryPath(this Assembly assembly)
{
    string filePath = new Uri(assembly.CodeBase).LocalPath;
    return Path.GetDirectoryName(filePath);            
}

现在你可以做:

var localDir = Assembly.GetExecutingAssembly().GetDirectoryPath();

或者如果你喜欢:

var localDir = typeof(DaoTests).Assembly.GetDirectoryPath();

其他回答

这应该可以工作,除非程序集是影子复制的:

string path = System.Reflection.Assembly.GetExecutingAssembly().Location

这么多年来,没有人真正提到过这一点。这是我从很棒的ApprovalTests项目中学到的技巧。诀窍在于使用程序集中的调试信息来查找原始目录。

在发布模式下,在启用优化的情况下,或者在与编译它的机器不同的机器上,这将不起作用。

但这将为您提供相对于您调用它的源代码文件的位置的路径

public static class PathUtilities
{
    public static string GetAdjacentFile(string relativePath)
    {
        return GetDirectoryForCaller(1) + relativePath;
    }
    public static string GetDirectoryForCaller()
    {
        return GetDirectoryForCaller(1);
    }


    public static string GetDirectoryForCaller(int callerStackDepth)
    {
        var stackFrame = new StackTrace(true).GetFrame(callerStackDepth + 1);
        return GetDirectoryForStackFrame(stackFrame);
    }

    public static string GetDirectoryForStackFrame(StackFrame stackFrame)
    {
        return new FileInfo(stackFrame.GetFileName()).Directory.FullName + Path.DirectorySeparatorChar;
    }
}

从。net framework 4.6 / .net core 1.0开始,现在有了一个AppContext。BaseDirectory,它应该给出与AppDomain.CurrentDomain相同的结果。除了AppDomains不是.net core 1的一部分。X /.net标准x的API。

AppContext.BaseDirectory

编辑:文档现在甚至声明:

在. net 5.0及更高版本中,对于捆绑的程序集,返回的值是主机可执行文件的包含目录。

事实上,组装。定位医生医生说:

在. net 5.0及更高版本中,对于捆绑的程序集,返回的值是空字符串。

当我使用CodeBase和UNC网络共享时,唯一有效的解决方案是:

System.IO.Path.GetDirectoryName(new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath);

它也适用于普通uri。

这样如何……

string ThisdllDirectory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

然后砍掉你不需要的部分