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






3.43/5 (5投票s)
本文介绍了一个创建 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.TemplateWizard
和 EnvDTE
)。
主类
一旦我们有了“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
为我们提供了管理项目创建的各种方式。对我们来说,重要的是只有这些方法:RunStarted
和 ProjectFinishedGenerating
。稍后,我想,你可以添加一些额外的代码来满足你的需求。
用户界面
让我们更仔细地了解我们的两个方法。RunStarted
在 VS 根据其模板完成新项目生成时开始,所以这是我们向导的主入口点。该方法的参数是
automationObject
– 可以转换为DTE
replacementsDictionary
– 包含模板的保留字,它们将被字典的值替换。此外,你可以按照%word%
的格式添加自己的。更多信息请参阅 MSDNrunKind
– 指定向导的运行类型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 中卸载它,然后重新安装它
最后
所以,现在你知道如何自动化一些你经常做的工作。希望你喜欢这个功能,并觉得它很有用。