Как развернуть пользовательскую задачу MSBuild с помощью MEF?

#visual-studio-2010 #msbuild #mef #vsix

#visual-studio-2010 #msbuild #mef #vsix

Вопрос:

У меня есть несколько пользовательских шаблонов элементов и проектов для Visual Studio 2010. Я создал пакет VSIX, который можно использовать для развертывания этих расширений на компьютерах нескольких разработчиков.

Сейчас я создаю пользовательскую задачу MSBuild, которая потребуется для нового шаблона элемента.

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

Но это не работает, когда пакет VSIX развертывается в экземпляре Visual Studio ‘dev’. Visual Studio просто сообщает, что CustomBuildTask.dll не удается найти.

Где VSIX развертывает DLL? Есть ли переменная MSBuild % (path), которую я могу использовать для поиска библиотеки DLL на других компьютерах, или каждый пользователь должен вручную скопировать библиотеку DLL и / или поместить глобальный файл «.tasks» в свою установку Visual Studio?

ПРИМЕЧАНИЕ: Для задач MSBuild не существует типа содержимого VSIX, как для шаблонов элементов и проектов. Я пробовал «VS Package», «MEF Component» и «Custom Extension Type» — и, похоже, ни один из них не работает.

Комментарии:

1. После поиска по всему диску я нашел свою DLL по адресу: C:Documents и настройки<идентификатор пользователя> Локальные настройки Данные приложения Microsoft Visual Studio 10.0Exp Extensions<Автор VSIX><Название продукта VSIX><Версия VSIX>MyCustomTask.dll Похоже, что VSIX развернул DLL именно здесь, но я не могу найти переменную MSBuild для использования в атрибуте UsingTask AssemblyFile AssemblyFile.

Ответ №1:

Я не верю, что вы можете это сделать, поскольку пакеты VSIX не могут устанавливать файлы в произвольные расположения, а задача msbuild должна находиться в папке msbuild.

Комментарии:

1. Я нашел дополнительную информацию. Вы правы. VSIX просто напросто не поддерживает это, и в документации говорится, что вместо этого следует использовать обычный установочный пакет MSI. Смотрите: blogs.msdn.com/b/visualstudio/archive/2010/06/09/… В разделе «Установка через MSI» говорится, что компоненты MSBuild «должны находиться в определенном, хорошо известном расположении», которое VSIX не поддерживает.

Ответ №2:

Решение для visual studio 2017/2019, которое, вероятно, работало бы в 2010 году (как Microsoft.VisualStudio.Тогда был доступен TemplateWizard ), заключается в создании мастера и указании пути к месту установки расширения в словаре замен и использовании замены в шаблоне с помощью UsingTask.

 public class ProjectLocationWizard : IWizard
{
    public void BeforeOpeningFile(ProjectItem projectItem)
    {
    }

    public void ProjectFinishedGenerating(Project project)
    {
    }

    public void ProjectItemFinishedGenerating(ProjectItem projectItem)
    {
    }

    public void RunFinished()
    {
    }

    public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
    {
        var wizardDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        replacementsDictionary.Add("$installlocation$", wizardDirectory);
    }

    public bool ShouldAddProjectItem(string filePath)
    {
        return true;
    }
}

<UsingTask AssemblyFile="$installlocation$MyTask.dll" TaskName="MyTask" />