2015-10-08 3 views
1

Я разрабатываю расширение для VS2015, и мне нужно получить папку проекта открытого решения. А затем найдите папку bin, чтобы получить выходную DLL. Все это, потому что мне нужно создать экземпляр класса из выходной DLL, используя отражение.Как получить папку проекта в проекте VSIX

Я попытался получить некоторую информацию из msdn, но мне это сложно понять. Есть ли способ сделать это?

Заранее спасибо

+0

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

ответ

1

Вы могли бы попробовать что-то вроде этого ...

Найти файл проекта интересов (возможно, проект запуска), или позволить пользователю выбрать его. Каталог выходных данных проекта хранится в файле проекта, поэтому следует использовать 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); 

... 
+0

Спасибо за помощь, мне просто нужно изменить «var p = new Project» (к «новому Microsoft.Build.Evaluation.Project» из-за конфликтов ссылок. –