【问题标题】:Using IWizard in an item template without installing assembly in GAC?在项目模板中使用 IWizard 而不在 GAC 中安装程序集?
【发布时间】:2013-04-21 02:02:31
【问题描述】:

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

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

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

在我看来这应该是一个普遍的问题?

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

【问题讨论】:

    标签: visual-studio-2010 visual-studio templates wizard


    【解决方案1】:

    经过大量研究,我找到了一种方法。使用此方法,可以将具有 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,然后将组装线添加到该部分

    例子:

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

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

    如果您在 vsix 中需要多个模板,您只需添加额外的 ItemTemplate 项目。所有向导都可以进入同一个 MyWizardImpl 程序集。

    【讨论】:

    • 将一个项目的输出作为一个项目包含在另一个项目中通常是脆弱的,在这种情况下有更好的方法来处理它。您可以将类库程序集作为资产添加到 VSIX 项目:打开 source.extension.vsixmanifest 并选择“资产”选项卡,然后单击“新建”,选择类型“程序集”,源“当前解决方案中的项目”,最后选择项目。该对话框中有一个标记为“嵌入此文件夹”的字段:只需将“程序集”放在那里。最终结果将完全相同,但它不会抛弃 MSBuild 依赖跟踪等。
    • 我认为VS2010中没有“资产”标签
    • @aaron 在 VS2010 中称为“内容”
    • 为什么将程序集添加为“资产”或“内容”比将其作为项目添加到项目中更好?看起来几乎一样。
    • 不确定现在 VS2013 的情况如何,但至少在 2010 年这是不可能的,当时在向导运行期间实际程序集不可用。
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多