#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" />