如何在不安装程序集到全局程序集缓存中的情况下,在项目模板中使用IWizard?

12

我希望创建包括向导(IWizard接口)的自定义项模板。

http://msdn.microsoft.com/en-us/library/vstudio/ms171411%28v=vs.100%29.aspx和其他一些地方,常常描述包含向导的程序集必须安装在GAC中。我想要在我的组织内分发我的模板,但不是每个人都有权将任何东西安装到GAC中。

所以我想知道,难道没有办法将包含向导代码的程序集放在模板zip或vsix文件中吗?

对我来说,这似乎应该是一个普遍的问题?

如何在没有任何GAC安装的情况下分发自定义向导和项模板?

1个回答

19

经过大量的研究,我找到了一种方法。使用这种方法,即使没有签名,也可以将与IWizard实现相关的程序集包括在VSIX文件中,并使其在运行时可用。无需操作GAC。

您的解决方案需要3个项目:

  1. vsix项目(我们称之为MyExtension
  2. 项目模板项目(我们称之为MyTemplate
  3. 用于向导代码的常规类库项目(我们称之为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,并在“内容”部分中添加一个Assembly行

示例:

<Content>
   <Assembly AssemblyName="MyWizardImpl">Assemblies\MyWizardImpl.dll</Assembly>
</Content>

构建和测试解决方案,现在使用模板时向导代码应该可以运行。

如果您需要在vsix中使用多个模板,只需添加其他ItemTemplate项目即可。所有的向导都可以放在同一个MyWizardImpl程序集中。


8
将一个项目的输出作为另一个项目的一项通常是脆弱的,而在这种情况下有更好的处理方法。您可以将类库程序集添加为VSIX项目的资源文件:打开open source.extension.vsixmanifest并选择“Assets”选项卡,然后点击“New”,选择类型“Assembly”,源选择“当前解决方案中的一个项目”,最后选择该项目。在对话框中有一个标签为“Embed in this folder”的字段:只需在其中输入“Assemblies”。最终结果将完全相同,但不会扰乱MSBuild依赖跟踪等。 - Pavel Minaev
1
我认为在VS2010中没有“资产”选项卡。 - aaron
在添加了<Content>标签后,出现了错误“无法找到源.extension.vsixmanifest中引用的TemplateWizard项目。请在source.extension.vsixmanifest中添加ProjectReference或更正项目名称。” - Neo
这在文档中有详细说明:https://learn.microsoft.com/en-us/visualstudio/extensibility/how-to-use-wizards-with-project-templates?view=vs-2019 - SteveB
@SteveB 很好,有时候随着年岁的增长,事情变得更容易了... - Achim
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接