65.9K
CodeProject 正在变化。 阅读更多。
Home

如何创建您自己的 Visual Studio 向导

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.43/5 (5投票s)

Aug 22, 2006

CPOL

6分钟阅读

viewsIcon

93685

本文介绍了一个创建 VS 向导的过程。

引言

本主题介绍如何为 Visual Studio 编写简单的“新建项目”向导,该向导将生成一些数据,例如代码文件,并将其附加到项目中。

第一部分:编码

你好!今天我们将学习如何创建自己的向导,它将为我们完成一些工作,而不是我们自己做。听起来不错,不是吗?

首先,我必须说明,这个向导是用于 VS 2005 的。所以启动它并创建一个新的类库项目。在生成的项目中(它从模板生成,我们稍后会讨论它们),打开 Class1.cs 文件(你可以重命名它),然后删除其中的所有代码行,因为我们将自己动手完成所有事情。

参考文献

首先,我们必须指定“using”部分。我们将使用这些命名空间

using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.VisualStudio.TemplateWizard;
using EnvDTE;

 

你可能会注意到一些不熟悉的名字。最后两个是 VS 2005 开发团队的命名空间,所以我们可以暂时感觉自己像 IDE 的创建者。好吧,如果我们想使用这些很酷的命名空间,我们必须添加具有相同名称的适当引用(Microsoft.VisualStudio.TemplateWizardEnvDTE)。

主类

一旦我们有了“using”部分,我们必须在其中创建命名空间和类。让我们这样做——命名空间必须与你的解决方案的默认命名空间相同(你可以在解决方案属性中看到它)。类可以是你想要的任何名称,最重要的是:它必须继承自 IWizard 接口,该接口将为我们提供所需的向导逻辑。例如

namespace SampleWizard
{
    public class WizardClass : IWizard
    {
    }
}

实施

好了,现在实现 IWizard 的方法将是极好的。我们来做这个

// 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) 
{
}

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

正如我们所见,IWizard 为我们提供了管理项目创建的各种方式。对我们来说,重要的是只有这些方法:RunStartedProjectFinishedGenerating。稍后,我想,你可以添加一些额外的代码来满足你的需求。

 

用户界面

让我们更仔细地了解我们的两个方法。RunStarted 在 VS 根据其模板完成新项目生成时开始,所以这是我们向导的主入口点。该方法的参数是

  • automationObject – 可以转换为 DTE
  • replacementsDictionary – 包含模板的保留字,它们将被字典的值替换。此外,你可以按照 %word% 的格式添加自己的。更多信息请参阅 MSDN
  • runKind – 指定向导的运行类型
  • customParams – 自定义参数

 

好吧,这个方法将是我们主要的。下一个问题是:我们如何设想我们向导的界面?顺便说一下,它可能完全是不可见的。例如,在此方法中,我们只能通过在开头添加单词“My”(使用 replacementsDictionary)或其他内容来更改项目名称。但在我们的例子中,我们将做得更多一些,并为向导添加用户界面。这非常简单。只需在解决方案中添加新窗体。我们称之为 UserInputForm。我们还在上面放置一些控件,如文本框、标签、按钮以及你想要的任何其他内容。我们的向导将自动向项目中添加一个带有生成空类的代码文件。所以调用文本框 tbName,将标签文本设置为:“输入新类的名称”,并将按钮设置为窗体的 AcceptButton,同时将其文本设置为 OK。

在窗体的代码中,创建一个名为 ClassName 的新字符串属性,并在 get-section 中写入

return tbName.Text;

接下来我们必须重写 OnClosing 事件并写入

if (ClassName == "")
    return;
base.OnClosing(e);

 

好吧,我认为这对于我们的训练样本来说足够了。让我们回到我们的 WizardClass 并在开头写入

private <code>UserInputForm newForm;

然后转到 RunStarted 方法并键入

newForm = new <code>UserInputForm();
newForm.ShowDialog();

项目管理

正如你所理解的,一旦 Visual Studio 创建新项目,就会显示我们的对话框。在此对话框中,用户应输入新类的名称,我们将创建该新类并将其添加到项目中。所以接下来我们想获得一个事件,我们可以在其中向项目添加一些东西。这就是 ProjectFinishedGenerating 方法。在这里,我们将使用 Input 表单中的数据创建一个新代码,将此代码写入文件,并将文件附加到项目中。类似于这样

string dir = Path.GetDirectoryName(project.FullName);
string code = 
    <code>"using System;\nusing System.Collections.Generic;\nusing System.Text;\n\n" +
    "namespace WizardGenerated\n{\n\r\tpublic class " + 
    newForm.ClassName + "\n\r\t{\n\r\t}\n}";
StreamWriter sw = new StreamWriter(dir + "\\" + newForm.ClassName + ".cs");
sw.Write(code);
sw.Close();
project.ProjectItems.AddFromFile(dir + "\\" + newForm.ClassName + ".cs");

 

我认为一切都很清楚。我们只是将用户定义的类名写入新代码文件的字符串模板。然后我们将其写入磁盘,并从文件添加新的项目项。

第二部分:安装

恭喜!

如果你已到达本节,则意味着你已创建了自己的向导。只需构建项目,即可生成包含向导的 dll。

但是我们可以用这个库做什么呢?好吧,安装向导也并非易事。首先,你必须将你的程序集(例如 dll)添加到 GAC(全局程序集缓存)。为此,你必须为程序集提供强名称,为此你必须签名你的程序集。听起来很吓人?去战斗!

签名

在 VS 2005 中,签名是一件非常容易的事情,因为它的开发人员在项目属性中添加了一个特殊的按钮,从而使我们免去了乏味的控制台操作。所以,转到你项目的属性页并切换到“Signing”选项卡。选中“Sign the assembly”框,然后在组合框中创建一个新的密钥文件。就是这样。

添加到 GAC

接下来,我们必须将程序集添加到 GAC。非常简单:只需从“开始\程序\Microsoft .NET Framework SDK v2.0”运行 SDK 命令提示符。在出现的命令窗口中键入:gacutil -i "<此处为编译后的 dll 路径>"。这将把你的 dll 安装到程序集缓存中,并允许你在模板中引用它。我们还必须知道程序集密钥的标记。有两种方法可以找到它。第一个是在同一个命令窗口中键入:gacutil –l >> "此处为文件路径"。这会列出所有已安装的程序集及其属性,包括指向指定文件的标记。使用此方法,你还可以确保程序集确实已添加到 GAC。只需在列表中按名称查找它并将其标记保存在某处。它必须是十六进制形式,类似于:2ee9fb161af32259。找到标记的另一种方法是使用来自同一 FW 2.0 SDK 的 sn.exe 工具。在命令提示符下键入:sn -T "<此处为 dll 路径>"。此命令将显示程序集的标记。

进入模板

所以,现在你有一个已安装在缓存中的程序集,并且你的标记在手中。是时候将向导的引用添加到某个模板了。你可以创建自己的模板,但这次我们将使用一个默认的 Visual Studio 模板。转到 MyDocuments 目录,在那里找到名为 Visual Studio 2005\Templates\ProjectTemplates\Visual C# 的文件夹。你可以在那里看到一个 zip 文件列表。这些是项目的存档模板。解压 Console.zip 并打开 MyTemplate.vstemplate 文件。我们会看到一个简单的 xml 文件。在“template content”节点之后,我们必须添加这些行

<WizardExtension>
    <Assembly>SampleWizard, Version=1.0.0.0, Culture=neutral, 
        PublicKeyToken=2ee9fb161af32259, Custom=null</Assembly>
    <FullClassName>SampleWizard.WizardClass</FullClassName>
</WizardExtension>

当然,你的值和名称可能不同。保存此文档后,只需将文件夹压缩回原样,然后重新启动 Studio。如果一切都清楚地完成了,当你尝试创建一个新的控制台项目时,我们的对话框将出现,并且在关闭向导对话框后,代码文件将被添加到项目中。

 

恢复一切

如果你想撤销这些操作,只需将模板存档恢复到其原始状态,然后使用带有 –u 键的 gacutil 从 GAC 中卸载 dll。如果你想对向导进行一些更改,你必须重新构建它,从 GAC 中卸载它,然后重新安装它

最后

所以,现在你知道如何自动化一些你经常做的工作。希望你喜欢这个功能,并觉得它很有用。

© . All rights reserved.