Как получить каталог текущего проекта из кода C # при создании пользовательской задачи MSBuild? - PullRequest
103 голосов
/ 03 мая 2009

Вместо того, чтобы запускать внешнюю программу с жестко заданным путем, я хотел бы получить текущий Project Dir. Я вызываю внешнюю программу, используя процесс в пользовательской задаче.

Как бы я это сделал? AppDomain.CurrentDomain.BaseDirectory просто дает мне местоположение VS 2008.

Ответы [ 20 ]

215 голосов
/ 09 августа 2012
using System;
using System.IO;

// This will get the current WORKING directory (i.e. \bin\Debug)
string workingDirectory = Environment.CurrentDirectory;
// or: Directory.GetCurrentDirectory() gives the same result

// This will get the current PROJECT directory
string projectDirectory = Directory.GetParent(workingDirectory).Parent.FullName;
99 голосов
/ 03 мая 2009

Вы можете попробовать один из этих двух методов.

string startupPath = System.IO.Directory.GetCurrentDirectory();

string startupPath = Environment.CurrentDirectory;

Скажите, какой из них вам кажется лучше

16 голосов
/ 17 сентября 2015

Это также даст вам каталог проекта, перейдя на два уровня вверх от текущего исполняющего каталога (он не вернет каталог проекта для каждой сборки, но это наиболее распространенный вариант).

System.IO.Path.GetFullPath(@"..\..\")

Конечно, вы хотите, чтобы это содержалось в некоторой логике проверки / обработки ошибок.

13 голосов
/ 03 августа 2018

Если проект выполняется в IIS Express, Environment.CurrentDirectory может указывать, где находится IIS Express (путь по умолчанию будет C: \ Program Files (x86) \ IIS Express ), не там, где находится ваш проект.


Вероятно, это наиболее подходящий путь к каталогу для различных типов проектов.

AppDomain.CurrentDomain.BaseDirectory

Это определение MSDN.

Получает базовый каталог, который распознаватель сборок использует для поиска сборок.

9 голосов
/ 23 мая 2013

Если вы не хотите знать, в каком каталоге находится ваше решение, вам нужно сделать следующее:

 var parent = Directory.GetParent(Directory.GetCurrentDirectory()).Parent;
            if (parent != null)
            {
                var directoryInfo = parent.Parent;
                string startDirectory = null;
                if (directoryInfo != null)
                {
                    startDirectory = directoryInfo.FullName;
                }
                if (startDirectory != null)
                { /*Do whatever you want "startDirectory" variable*/}
            }

Если вы разрешите только методом GetCurrrentDirectory(), вы получите папку сборки независимо от того, выполняете ли вы отладку или выпуск. Я надеюсь, что это поможет! Если вы забудете о проверках, это будет выглядеть так:

var startDirectory = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
5 голосов
/ 22 августа 2011

Я тоже искал это. У меня есть проект, который запускает HWC, и я бы хотел, чтобы веб-сайт не входил в дерево приложений, но я не хочу, чтобы он был в каталоге отладки (или выпуска). FWIW, принятое решение (и это тоже) идентифицирует только каталог, в котором выполняется исполняемый файл.

Чтобы найти этот каталог, я использовал

string startupPath = System.IO.Path.GetFullPath(".\\").
4 голосов
/ 16 июня 2015

Еще один способ сделать это

string startupPath = System.IO.Directory.GetParent(@"./").FullName;

Если вы хотите получить путь к папке bin

string startupPath = System.IO.Directory.GetParent(@"../").FullName;

Может быть, есть лучший способ =)

4 голосов
/ 10 октября 2015

Еще одно несовершенное решение (но, возможно, немного ближе к идеальному, чем некоторые другие):

    protected static string GetSolutionFSPath() {
        return System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.FullName;
    }
    protected static string GetProjectFSPath() {
        return String.Format("{0}\\{1}", GetSolutionFSPath(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }

Эта версия будет возвращать папку текущих проектов , даже если текущий проект не является Startup Project для решения.

Первый недостаток в том, что я пропустил все проверки ошибок. Это можно исправить достаточно просто, но это должно стать проблемой только в том случае, если вы храните свой проект в корневом каталоге диска или используете соединение в своем пути (а это соединение является потомком папки решения), поэтому этот сценарий маловероятен , Я не совсем уверен, что Visual Studio в любом случае сможет справиться с любой из этих настроек.

Другая (более вероятная) проблема, с которой вы можете столкнуться, заключается в том, что имя проекта должно совпадать с именем папки проекта, чтобы его можно было найти.

Другая проблема, с которой вы можете столкнуться, заключается в том, что проект должен находиться внутри папки решения. Обычно это не проблема, но если вы использовали опцию Add Existing Project to Solution для добавления проекта в решение, тогда это может быть не то, как ваше решение организовано.

Наконец, если ваше приложение будет изменять рабочий каталог, вы должны сохранить это значение, прежде чем делать это, потому что это значение определяется относительно текущего рабочего каталога.

Конечно, все это также означает, что вы не должны изменять значения по умолчанию для параметров Build -> Output path или Debug -> Working directory в диалоговом окне свойств проекта.

3 голосов
/ 15 февраля 2012

У меня была похожая ситуация, и после бесплодного поиска в Google я объявил открытую строку, которая модифицирует строковое значение пути отладки / выпуска, чтобы получить путь к проекту. Преимущество использования этого метода заключается в том, что, поскольку он использует каталог правильного проекта, не имеет значения, работаете ли вы из каталога отладки или каталога выпуска:

public string DirProject()
{
    string DirDebug = System.IO.Directory.GetCurrentDirectory();
    string DirProject = DirDebug;

    for (int counter_slash = 0; counter_slash < 4; counter_slash++)
    {
        DirProject = DirProject.Substring(0, DirProject.LastIndexOf(@"\"));
    }

    return DirProject;
}

После этого вы сможете звонить в любое время, используя только одну строку:

string MyProjectDir = DirProject();

Это должно работать в большинстве случаев.

3 голосов
/ 12 июля 2018

Попробуйте, это просто

HttpContext.Current.Server.MapPath("~/FolderName/");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...