经过大量研究,我找到了一种方法来做到这一点。使用此方法,可以将具有 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
- 在 XML 编辑器(或记事本)中打开 vsixmanifest,并将组装线添加到该部分
例子:
<Content>
<Assembly AssemblyName="MyWizardImpl">Assemblies\MyWizardImpl.dll</Assembly>
</Content>
构建并测试解决方案,使用模板时,向导代码现在应该运行。
如果您的 vsix 中需要多个模板,您只需添加额外的 ItemTemplate 项目。所有向导都可以进入同一个 MyWizardImpl 程序集。