Вы могли бы попробовать что-то вроде этого ...
Найти файл проекта интересов (возможно, проект запуска), или позволить пользователю выбрать его. Каталог выходных данных проекта хранится в файле проекта, поэтому следует использовать MSBuild
для чтения этой информации или, лучше: пусть MSBuild
оценивает свойство целевого пути сборки сборки проекта. Вам понадобится абсолютный путь к файлу проекта или ссылку EnvDTE.Project
.
Абсолютный путь к выходу может быть получен путем оценки свойства TargetPath
. Вам нужно сослаться на сборку Microsoft.Build.dll
, создать новую коллекцию проектов и загрузить проект, создав новый экземпляр класса Microsoft.Build.Evaluation.Project
. Это позволит вам запрашивать определенные свойства из проекта и их оцененных значений ...
using Microsoft.Build.Evaluation;
...
public static string GetTargetPathFrom(EnvDTE.VsProject project)
{
const string PropertyName = "TargetPath";
return GetPropertyValueFrom(project.FileName, PropertyName);
}
public static string GetPropertyValueFrom(string projectFile, string propertyName)
{
using (var projectCollection = new ProjectCollection())
{
var p = new Project(
projectFile,
null,
null,
projectCollection,
ProjectLoadSettings.Default);
return p.Properties
.Where(x => x.Name == propertyName)
.Select(x => x.EvaluatedValue)
.SingleOrDefault();
}
}
}
Образец Приведенную выше будет использовать конфигурацию сборки проекта по умолчанию; Я не пробовал, но может измениться свойства Platform
и Configuration
, передав глобальные свойства Project
ctor. Вы могли бы попробовать это ...
...
var globalProperties = new Dictionary<string, string>()
{
{ "Configuration", "Debug" },
{ "Platform", "AnyCPU" }
};
var p = new Project(
projectFile,
globalProperties,
null,
projectCollection,
ProjectLoadSettings.Default);
...
У самого решения нет выходной папки, но решение может содержать несколько проектов - и каждый проект имеет свой собственный выходной каталог (который зависит от выбранной конфигурации решения) , – Matze