在项目模板中使用IWizard而无需在GAC中安装程序集?

Ach*_*him 11 templates wizard visual-studio-2010 visual-studio

我想创建一个包含向导(IWizard界面)的自定义项模板.

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

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

在我看来,这应该是一个常见的问题?

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

Ach*_*him 18

经过大量的研究,我找到了一种方法.使用此方法,可以将包含IWizard实现的程序集包含在VSIX文件中,即使不对其进行签名,也可以在运行时使用它.无需摆弄GAC.

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

  1. vsix项目(我们称之为MyExtension)
  2. 项目模板项目(我们称之为MyTemplate)
  3. 向导代码的常规类库项目(我们称之为MyWizardImpl)

在MyWizardImpl中,您需要在arbitray类中实现IWizard接口.(我们称之为MyWizardImpl.ItemTemplateWizard1).编译时,你得到输出

<solutiondir>\MyWizardImpl\bin\Debug\MyWizardImpl.dll
Run Code Online (Sandbox Code Playgroud)

现在,在MyTemplate\MyTemplate.vstemplate中,您需要引用它

<WizardExtension>
    <Assembly>MyWizardImpl</Assembly>
    <FullClassName>MyWizardImpl.ItemTemplateWizard1</FullClassName>
</WizardExtension>
Run Code Online (Sandbox Code Playgroud)

棘手的部分是最后一个:在应用ItemTemplate时可以加载的方式将程序集包含在vsix中.

  • 创建一个文件夹MyExtension\Assemblies
  • 在解决方案资源管理器中,右键单击该文件夹,然后选择添加 - >现有项...
  • 在"添加现有项"对话框中,导航到创建的MyWizardImpl.dll.在"添加"按钮上,单击小箭头并选择"添加为链接"(以防止VS制作dll的副本)
  • 在此链接的属性中,选择BuildAction = Content,IncludeInVSIX = True
  • 在XML编辑器(或记事本)中打开vsixmanifest,并在该部分中添加一个Assembly行

例:

<Content>
   <Assembly AssemblyName="MyWizardImpl">Assemblies\MyWizardImpl.dll</Assembly>
</Content>
Run Code Online (Sandbox Code Playgroud)

构建并测试解决方案,使用模板时,向导代码应立即运行.

如果您的vsix中需要多个模板,则只需添加其他ItemTemplate项目.所有向导都可以进入相同的MyWizardImpl程序集.

  • 将一个项目的输出作为项目包含在另一个项目中通常很脆弱,在这种情况下有更好的方法来处理它.您可以将类库程序集作为资源添加到VSIX项目:open source.extension.vsixmanifest并选择"Assets"选项卡,然后单击"New",选择"Assembly"类型,源"当前解决方案中的项目",最后挑选项目.该对话框中有一个标记为"嵌入此文件夹"的字段:只需将"程序集"放在那里.最终结果将完全相同,但它不会抛弃MSBuild依赖关系跟踪等. (8认同)