如何:使用向导来处理项目模板

更新:2007 年 11 月

Visual Studio 提供了 IWizard 接口。在实现该接口后,您可以在用户根据模板创建项目时运行自定义代码。

项目模板的自定义可用于:

  • 显示收集用户输入以参数化模板的自定义 UI。

  • 添加要在模板中使用的参数值。

  • 向模板添加其他文件。

  • 执行项目的 Visual Studio 自动化对象模型允许的几乎任何操作。

在创建项目过程中的各个时间(从用户单击“新建项目”对话框上的“确定”开始)都会调用 IWizard 接口方法。接口的每个方法都被命名以描述调用该方法的时刻。例如,当 Visual Studio 开始创建项目时,它立即调用 RunStarted,这使其成为编写自定义代码以收集用户输入的一个良好位置。

为自定义向导编写的大多数代码将使用 DTE 对象(它是 Visual Studio 自动化对象模型中的主对象)来自定义项目。有关自动化对象模型的更多信息,请参见扩展 Visual Studio 环境自动化与扩展性参考

创建自定义模板向导

本主题显示如何创建一个自定义向导,该向导在创建项目之前打开一个 Windows 窗体。此窗体允许用户添加自定义参数值,此值随后在创建项目的过程中被添加到源代码中。主要步骤如下所示,其中每一步都有详细解释。

创建自定义模板向导

  1. 创建实现 IWizard 接口的程序集。

  2. 将此程序集安装到全局程序集缓存中。

  3. 创建一个项目并使用“导出模板”向导根据该项目创建模板。

  4. 通过在 .vstemplate 文件中添加 WizardExtension 元素来修改模板,以将此模板链接到实现 IWizard 的程序集。

  5. 使用自定义向导创建新项目。

实现 IWizard

此过程的第一步是创建实现 IWizard 的程序集。此程序集使用 RunStarted 方法显示一个 Windows 窗体,该窗体允许用户添加一个自定义参数值,随后将在创建项目的过程中使用此值。

说明:

本示例使用 Visual C# 实现 IWizard,但是您也可以使用 Visual J# 或 Visual Basic。

实现 IWizard

  1. 创建一个新类库项目。

  2. 创建实现 IWizard 接口的类。请参见下面的 Visual C# 示例的代码,该示例完全实现了 IWizard 接口。

本示例包含两个代码文件:IWizardImplementation,它是一个实现 IWizard 接口的类;以及 UserInputForm,它是用于获得用户输入的 Windows 窗体。

IWizardImplementation 类

IWizardImplementation 类包含 IWizard 的每个成员的方法实现。在本示例中,只有 RunStarted 方法执行任务。所有其他方法要么不执行任何任务,要么返回 true。

RunStarted 方法接受四个参数:

  • Object 参数,可强制转换为根 _DTE 对象,以使您能够自定义项目。

  • Dictionary<TKey, TValue> 参数,它包含模板中所有预定义参数的集合。有关模板参数的更多信息,请参见 模板参数

  • WizardRunKind 参数,它包含有关所使用的模板种类的信息。

  • Object 数组,它包含通过 Visual Studio 传递给向导的一组参数。

本示例将一个来自用户输入窗体的参数值添加到 Dictionary<TKey, TValue> 参数中。项目中 $custommessage$ 参数的每个实例都将替换为用户输入的文本。

using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TemplateWizard;
using System.Windows.Forms;
using EnvDTE;

namespace CustomWizard
{
    public class IWizardImplementation:IWizard
    {
        private UserInputForm inputForm;
        private string customMessage;

        // This method is called before opening any item that 
        // has the OpenInEditor attribute.
        public void BeforeOpeningFile(ProjectItem projectItem)
        {
        }

        public void ProjectFinishedGenerating(Project project)
        {
        }
        
        // This method is only called for item templates,
        // not for project templates.
        public void ProjectItemFinishedGenerating(ProjectItem 
            projectItem)
        {
        }

        // This method is called after the project is created.
        public void RunFinished()
        {
        }

        public void RunStarted(object automationObject,
            Dictionary<string, string> replacementsDictionary,
            WizardRunKind runKind, object[] customParams)
        {
            try
            {
                // Display a form to the user. The form collects 
                // input for the custom message.
                inputForm = new UserInputForm();
                inputForm.ShowDialog();

                customMessage = inputForm.get_CustomMessage();

                // Add custom parameters.
                replacementsDictionary.Add("$custommessage$", 
                    customMessage);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        // This method is only called for item templates,
        // not for project templates.
        public bool ShouldAddProjectItem(string filePath)
        {
            return true;
        }        
    }
}

用户输入窗体

用户输入窗体提供一个用于输入自定义参数的简单窗体。该窗体包含一个名为 textBox1 的文本框和一个名为 button1 的按钮。单击此按钮时,文本框中的文本将存储在 customMessage 参数中。

向解决方案添加 Windows 窗体

  1. 在“项目”菜单上单击“添加新项”。

  2. 单击“Windows 窗体”,将文件命名为 UserInputForm.cs,然后单击“确定”。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace CustomWizard
{
    public partial class UserInputForm : Form
    {
        private string customMessage;

        public UserInputForm()
        {
            InitializeComponent();
        }
       
        public string get_CustomMessage()
        {
            return customMessage;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            customMessage = textBox1.Text;

            this.Dispose();
        }
    }
}

将程序集安装到全局程序集缓存中

必须用强名称对实现 IWizard 的程序集进行签名,并将该程序集安装到全局程序集缓存中。

将程序集安装到全局程序集缓存中

  1. 用强名称对程序集进行签名。有关更多信息,请参见如何:使用强名称为程序集签名如何:对程序集进行签名 (Visual Studio)

  2. 将强名称程序集安装到全局程序集缓存中。有关更多信息,请参见 如何:将程序集安装到全局程序集缓存

创建要用作模板的项目

在本示例中,用作模板的项目是一个控制台应用程序,它显示在自定义向导的用户输入窗体中指定的消息。

创建示例项目

  1. 创建一个新的 Visual C# 控制台应用程序。

  2. 在应用程序的 Main 方法中,添加以下代码行。

    Console.WriteLine("$custommessage$");
    

    当根据模板创建项目时,参数 $custommessage$ 将替换为在用户输入窗体中输入的文本。

  3. 在“文件”菜单上,单击“导出模板”。

  4. 在“导出模板”向导中,单击“项目模板”,选择正确的项目,然后单击“下一步”。

  5. 在“导出模板”向导中,输入关于该模板的描述性信息,选择“自动将模板导入到 Visual Studio 中”复选框,然后单击“完成”。

    现在,模板显示在“新建项目”对话框中,但没有使用自定义向导。

下面的示例显示导出到模板之前的完整代码文件。

using System;
using System.Collections.Generic;
using System.Text;

namespace TemplateProject
{
    class WriteMessage
    {
        static void Main(string[] args)
        {
            Console.WriteLine("$custommessage$");
        }
    }
}

修改模板

现在,模板已被创建并显示在“新建项目”对话框中,必须对其进行修改,以便它使用在前面步骤中创建的程序集。

向模板添加自定义向导

  1. 找到包含该模板的 .zip 文件。

    1. 在“工具”菜单上单击“选项”。

    2. 单击“项目和解决方案”。

    3. 读取“Visual Studio 用户项目模板位置”文本框。有关更多信息,请参见“选项”对话框 ->“项目和解决方案”->“常规”

    默认情况下,此位置为 My Documents\Visual Studio 2008\Templates\ProjectTemplates。

  2. 解压缩该 .zip 文件。

  3. 在 Visual Studio 中打开 .vstemplate 文件。

  4. TemplateContent 元素后,添加具有自定义向导程序集的强名称的 WizardExtension 元素(Visual Studio 模板) 元素。有关查找程序集的强名称的更多信息,请参见 如何:查看全局程序集缓存的内容如何:引用具有强名称的程序集

    下面的示例显示一个 WizardExtension 元素。

    <WizardExtension>
        <Assembly>CustomWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=fa3902f409bb6a3b</Assembly>
        <FullClassName>CustomWizard.IWizardImplementation</FullClassName>
    </WizardExtension>
    

使用自定义向导

现在,您可以根据自己的模板创建项目并使用自定义向导。

使用自定义向导

  1. 在“文件”菜单上,单击“新建项目”。

  2. 在“新建项目”对话框中,定位您的模板,键入名称,然后单击“确定”。

    向导用户输入窗体将打开。

  3. 为自定义参数键入一个值并单击按钮。

    向导用户输入窗体将关闭,并且根据模板创建了一个项目。

  4. 在“解决方案资源管理器”中,右击源代码文件并单击“查看代码”。

    请注意,$custommessage$ 已替换为在向导用户输入窗体中输入的文本。

请参见

参考

WizardExtension 元素(Visual Studio 模板)

IWizard

其他资源

高级模板过程