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

基本上,我的单元测试需要读取一些相对于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 () 给出与前面相同的结果。


当前回答

在windows窗体应用程序中,你可以简单地使用应用程序。StartupPath

但对于dll和控制台应用程序,代码更难记住…

string slash = Path.DirectorySeparatorChar.ToString();
string root = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

root += slash;
string settingsIni = root + "settings.ini"

其他回答

与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();

ASP。网络,不管用。我在为什么AppDomain.CurrentDomain.BaseDirectory不包含asp.net应用程序中的“bin”中找到了一个更好的解决方案。它适用于Win Application和ASP。Net Web应用程序。

public string ApplicationPath
    {
        get
        {
            if (String.IsNullOrEmpty(AppDomain.CurrentDomain.RelativeSearchPath))
            {
                return AppDomain.CurrentDomain.BaseDirectory; //exe folder for WinForms, Consoles, Windows Services
            }
            else
            {
                return AppDomain.CurrentDomain.RelativeSearchPath; //bin folder for Web Apps 
            }
        }
    }

我在过去的NUnit中得到了相同的行为。默认情况下,NUnit将程序集复制到临时目录。你可以在NUnit设置中改变这种行为:

也许TestDriven。NET和MbUnit GUI有相同的设置。

AppDomain.CurrentDomain.BaseDirectory

工作与MbUnit GUI。

我相信这适用于任何类型的应用:

AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory