Как получить текущий каталог проекта из кода C# при создании пользовательской задачи MSBuild?



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



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

3886   15  

15 ответов:

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

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

string startupPath = Environment.CurrentDirectory;

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

Я надеюсь, что это поможет:

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;

Это позволит получить каталог проекта

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

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

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

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

 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;

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


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

AppDomain.CurrentDomain.BaseDirectory

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

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

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

найти этот каталог, я использую

string startupPath = System.IO.Path.GetFullPath(".\").

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

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

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

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

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

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

    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 параметры в диалоговом окне свойства проекта.

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

во-первых, вы должны включить Microsoft.Win32 пространство имен, так что вы можете работать с реестром:

using Microsoft.Win32;    // required for reading and / or writing the registry

вот основной код:

RegistryKey Projects_Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio.0", false);
string DirProject = (string)Projects_Key.GetValue(@"DefaultNewProjectLocation");

примечание к этому ответу:

Я использование Visual Studio 2008 Professional Edition. Если вы используете другую версию, (т. е. 2003, 2005, 2010; и т. д.), то вам может потребоваться изменить часть "версия" строки подраздела (т. е. 8.0, 7.0; и т. д.).

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

  • dm

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

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

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

используйте это, чтобы получить каталог проекта (работал для меня):

string projectPath = 
    Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;

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

HttpContext.Current.Server.MapPath("~/FolderName/");

лучшим решением

string PjFolder1 =
    Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).
        Parent.Parent.FullName;

другое решение

string pjFolder2 = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(
                System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)));

проверьте его, AppDomain.CurrentDomain.BaseDirectory работал для меня на прошлом проекте, теперь я получаю папку отладки .... выбранный хороший ответ просто не работает!.

//Project DEBUG folder, but STILL PROJECT FOLDER
string pjDebugFolder = AppDomain.CurrentDomain.BaseDirectory;

//Visual studio folder, NOT PROJECT FOLDER
//This solutions just not work
string vsFolder = Directory.GetCurrentDirectory();
string vsFolder2 = Environment.CurrentDirectory;
string vsFolder3 = Path.GetFullPath(".\");   

//Current PROJECT FOLDER
string ProjectFolder = 
    //Get Debug Folder object from BaseDirectory ( the same with end slash)
    Directory.GetParent(pjDebugFolder).
    Parent.//Bin Folder object
    Parent. //Project Folder object
    FullName;//Project Folder complete path

я использовал следующее решение, чтобы получить работу:

string projectDir = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\.."));

.GetParent(Каталог.GetCurrentDirectory()).Родитель.Родитель.Родитель.Родитель.Полное имя

даст вам каталог проекта.

Comments

    Ничего не найдено.