У меня есть решение Visual Studio, состоящее из нескольких проектов, разделенных по разным каталогам.
В моем коде C# или VB.NET я хочу определить базовый каталог (или каталог, в котором находится решение).
Грязным решением было бы вызывать каталог parent.parent.parent, пока я не найду файл * .sln, но у меня также есть несколько решений в других каталогах, которые я не хочу возвращать.
Мне просто интересно, есть ли более чистый метод, возможно, часть System.Diagnostics.Debugger или аналогичный?
С нетерпением жду вашего ответа, спасибо.





Даже если у вас есть решения в других каталогах, по-видимому, это не каталоги в вашем исходном решении, не так ли? Какую ситуацию вы предполагаете, когда «повторять до тех пор, пока вы не найдете файл .sln» не удастся (кроме запуска из неправильного каталога)?
Альтернативой может быть передача каталога решения в качестве аргумента командной строки.
Зачем тебе это нужно, из интереса?
Поскольку файл sln не нужно развертывать на целевой машине, зачем вы вообще пытаетесь его найти?
Если вы все еще хотите использовать sln - попробуйте Пространство имен EnvDTE
EnvDTE.DTE dte = (EnvDTE.DTE) System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
string folder = System.IO.Path.GetDirectoryName(dte.ActiveDocument.FullName);
Выполняется ли код изнутри решения, то есть в отладчике IDE? Если это так, вы можете передать каталог решения как $(SolutionDir) из IDE в командную строку.
Спасибо за ваши ответы. Все были очень любезны. Я работал с ответом от Dror и с небольшой модификацией следующей строки решил эту проблему, спасибо.
string folder = System.IO.Path.GetDirectoryName(dte.Solution.FullName);
Причина, по которой я хочу это сделать, заключается в том, что во время выполнения кода в среде IDE я определяю текущую версию проекта Subversion, чтобы я мог встроить ее в работающую версию программного обеспечения.
Это делается автоматически. См. Статью, которую я написал на codeproject: текст ссылки
Если вы посмотрите на код, вы увидите, что я выполняю следующее: dirinfoSourceWorkingDir = dirInfo.Parent (). Parent (). Parent ();
Мне нужно определить каталог решения, открытого в настоящее время в Visual Studio, но мне нужен более чистый способ (и если я изменю структуру каталогов, это нарушит код).
Надеюсь, это имеет смысл!
Это может не сработать, если открыто два или более экземпляра. Вы должны найти правильный экземпляр в таблице запущенных объектов. Для этого есть код.