Ответ 1
После многих исследований я нашел способ сделать это. С помощью этого метода можно включить сборку с реализацией IWizard в файл VSIX, даже не подписывая ее, и иметь ее доступную во время выполнения. Не нужно возиться с GAC.
Вам нужно 3 проекта в вашем решении
- проект vsix (мы называем его MyExtension)
- проект шаблона элемента (мы называем его MyTemplate)
- обычный проект библиотеки классов для кода мастера (мы называем его MyWizardImpl)
Внутри MyWizardImpl вам необходимо реализовать интерфейс IWizard в классе арбитража. (мы называем это MyWizardImpl.ItemTemplateWizard1). При компиляции это вы получаете как вывод
<solutiondir>\MyWizardImpl\bin\Debug\MyWizardImpl.dll
Теперь, в MyTemplate\MyTemplate.vstemplate, вам нужно ссылаться на него
<WizardExtension>
<Assembly>MyWizardImpl</Assembly>
<FullClassName>MyWizardImpl.ItemTemplateWizard1</FullClassName>
</WizardExtension>
Последняя сложная часть: включение сборки внутри vsix таким образом, что ее можно загрузить, когда применяется ItemTemplate.
- Создать папку MyExtension\Assemblies
- В проводнике решений щелкните правой кнопкой мыши эту папку и выберите Добавить → Существующий элемент...
- В диалоговом окне "Добавить существующий элемент" перейдите к созданному MyWizardImpl.dll. На кнопке "Добавить" щелкните маленькую стрелку и выберите "Добавить как ссылку" (чтобы избежать того, что VS создает копию dll).
- В свойствах этой ссылки выберите BuildAction = Content, IncludeInVSIX = True
- Откройте vsixmanifest в редакторе XML (или в блокноте) и добавьте строку сборки в раздел
Пример:
<Content>
<Assembly AssemblyName="MyWizardImpl">Assemblies\MyWizardImpl.dll</Assembly>
</Content>
Создайте и протестируйте решение, код мастера должен запускаться при использовании шаблона.
Если вам нужно несколько шаблонов в вашем vsix, вам просто нужно добавить дополнительные проекты ItemTemplate. Все мастера могут войти в ту же сборку MyWizardImpl.