Развертывание сборки, содержащей IWizard для шаблона проекта с VSIX

Я создал расширение для VS 2010, которое развертывает шаблон проекта. Шаблон проекта использует специальный мастер (в конкретной сборке), который вызывается при создании нового проекта на основе этого шаблона.

Я хочу упаковать сборку, содержащую мастер в VSIX, чтобы он был развернут где-то, где шаблон может его найти (я знаю, что GAC не является вариантом с VSIX).

В принципе, если я развожу сборку в GAC, установите VSIX, а затем создайте проект, который мастер успешно вызвал. Если я сделаю то же самое без развертывания сборки сначала, шаблоны проекта не найдут сборку при создании проекта.

Мой вопрос: как развернуть шаблон проекта и его сборку, используя пакет VSIX?

Спасибо за помощь

EDIT: я изменил Sub Path VSIX ссылки на сборку мастера на "ProjectTemplates" в проекте установщика и соответствующим образом обновил ссылку на сборку содержимого vsixmanifest. Теперь он работает.

Ответы

Ответ 1

Вам не нужно, чтобы ваша сборка содержала реализацию IWizard в GAC. Вы можете просто объявить его в файле extension.vsixmanifest как элемент сборки в разделе "Содержимое".

К сожалению, это нигде не документировано.

Единственная сложная часть - убедиться, что атрибут AssemblyName имеет правильное значение.

Ответ 2

Мне не повезло с тем, что техника элемента Assembly работает, поэтому, если кто-то другой столкнулся с одной и той же проблемой, вот еще одно решение.

Visual Studio ищет библиотеки мастеров с помощью раздела реестра BindingPaths. Если вы добавите папку, содержащую вашу DLL, в подраздел BindingPaths, то Visual Studio найдет вашу DLL.

Чтобы сделать это из VSIX, создайте файл .pkgdef в проекте VSIX. Установите для параметра Свойство Include в VSIX значение True и вставьте в него следующий текст:

[$RootKey$\BindingPaths\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}]
"$PackageFolder$"=""

(где Xs представляют GUID пакета, хотя я подозреваю, что любой GUID будет делать).

Ответ 3

Это работает для меня:

[$RootKey$\BindingPaths\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}]
"$PackageFolder$"=""

Но элемент сборки не работает.