构建 VS .NET 向导 - 第 1 部分






4.80/5 (10投票s)
2005年5月5日
4分钟阅读

52825
Visual Studio .NET 已经为我们提供了很多向导,可以帮助我们创建骨架类和项目。开发人员可以扩展这些模板,甚至修改现有的模板。
目录
这是一种魔法
继续!运行 Visual Studio 并以任何你想要的语言(例如 C#)创建一个新项目。点击“确定”后会发生什么?这是一种魔法…… Visual Studio 会为你创建一个新项目,并在该项目中添加一个空类。Visual Studio 提供了很多漂亮的向导,可以帮助你开发大型项目——但这足够了吗?
我决定说“不”!所以,拿起你的水晶球,看看魔法的揭晓……
引言
这是我决定写的系列文章中的第一篇,共四篇。它涵盖了调整现有向导的方法。在 CodeProject 上还有一些其他资源也解释了相同的主题。我已经将它们添加到了本文末尾的参考部分。其中一篇非常好的文章是 Emil Aström 的《为 Visual Studio.NET 创建项目项代码模板》,所以我不想再次讨论这篇文章中描述的概念。
开发人员应该始终做的一些事情是记录和测试他们的代码。使用 C# 可以轻松地使用代码文档标签来完成代码文档,并且可以使用 NDoc 等工具将其生成为易于阅读的格式。可以使用 NUnit 或 TestDriven.NET(一个很棒的 Visual Studio 插件)来完成测试。
因此,在创建新类时,你通常会执行一些步骤,例如向类添加代码注释,其中包括类在代码注释的 <remarks>
部分中的日期、时间和作者。这通常适用于为你创建的默认构造函数。也许你还想为你的类中的字段、属性、构造函数和方法添加一些区域?
using System;
using System.Diagnostics;
namespace Wizardry1
{
/// <summary>
/// Comments for Class1.
/// </summary>
/// <remarks>
/// <para>created: 5.May 2005</para>
/// <para>Author : Michael Groeger</para>
/// </remarks>
public class Class1
{
#region Class1 fields
// add private fields here
#endregion
#region Class1 properties
// add properties here
#endregion
#region Class1 constructors
/// <summary>
/// Constructor.
/// </summary>
/// <remarks>
/// <para>created: 5.May 2005</para>
/// <para>Author : Michael Groeger</para>
/// </remarks>
public Class1()
{
//
// TODO: Add constructor logic here
//
}
#endregion
#region Class1 public members
// add public members (properties/methods) here
#endregion
#region Class1 private members
// add private members (properties/methods) here
#endregion
}
}
调整类模板
类模板
当你使用 Visual Studio 向导向项目中添加新类时,骨架类是从模板创建的,该模板可以在 C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\VC#Wizards\CSharpAddClassWiz\Templates\1033\ 找到,名为 NewCSharpFile.cs。它看起来应该像这样
using System;
namespace [!output SAFE_NAMESPACE_NAME]
{
/// <summary>
/// Zusammenfassung für [!output SAFE_CLASS_NAME].
/// </summary>
public class [!output SAFE_CLASS_NAME]
{
public [!output SAFE_CLASS_NAME]()
{
//
// TODO: Fügen Sie hier die Konstruktorlogik hinzu
//
}
}
}
备注:子目录 1033 包含模板的美国英语本地化版本。
SAFE_NAMESPACE_NAME
和 SAFE_CLASS_NAME
分别是命名空间和类名的占位符。向导将用你设置的类名和新类对应的命名空间替换它们。现在,我们想稍微调整一下模板。
添加一些代码注释
备份类模板 NewCSharpFile.cs,然后打开其副本,并将其另存为 NewCSharpFile.cs。在 Visual Studio 中打开模板,并添加一些注释和区域,如下所示
using System;
namespace [!output SAFE_NAMESPACE_NAME]
{
/// <summary>
/// Comments for [!output SAFE_CLASS_NAME]
/// </summary>
/// <remarks>
/// <para>created: [!output CREATION_DATE]/para>
/// <para>Author : Your name goes here</para>
/// </remarks>
public class [!output SAFE_CLASS_NAME]
{
#region [!output SAFE_CLASS_NAME] fields
// add private fields here
#endregion
#region [!output SAFE_CLASS_NAME] properties
// add properties here
#endregion
#region [!output SAFE_CLASS_NAME] constructors
/// <summary>
/// Constructor.
/// </summary>
/// <remarks>
/// <para>created: [!output CREATION_DATE]</para>
/// <para>Author : Your name goes here</para>
/// </remarks>
public [!output SAFE_CLASS_NAME]()
{
//
// Add constructor logic here
//
}
#endregion
#region [!output SAFE_CLASS_NAME] public members
// add public members (properties/methods) here
#endregion
#region [!output SAFE_CLASS_NAME] private members
// add private members (properties/methods) here
#endregion
}
}
保存文件,然后启动另一个 Visual Studio 实例。打开一个项目,并使用向导添加一个新类。现在生成的类应该看起来像这样
using System;
namespace Wizardry1
{
/// <summary>
/// Zusammenfassung fr MyClass.
/// </summary>
/// <remarks>
/// <para>erstellt: [!output CREATION_DATE]</para>
/// <para>Author : Michael Groeger</para>
/// </remarks>
public class MyClass
{
#region MyClass fields
// add private fields here
#endregion
#region MyClass properties
// add properties here
#endregion
#region MyClass constructors
/// <summary>
/// Constructor.
/// </summary>
/// <remarks>
/// <para>erstellt: [!output CREATION_DATE]</para>
/// <para>Author : Michael Groeger</para>
/// </remarks>
public MyClass()
{
//
// TODO: Fgen Sie hier die Konstruktorlogik hinzu
//
}
#endregion
#region MyClass public members
// add public members (properties/methods) here
#endregion
#region MyClass private members
// add private members (properties/methods) here
#endregion
}
}
所以,向导为你做了一项出色的工作。但是占位符 CREATION_DATE
没有被替换。CREATION_DATE
不是 Visual Studio 向导附带的参数之一。所以你必须自己添加它。
添加自定义参数
在 Templates 子目录的类模板旁边,有一个名为 default.js 的 JScript 文件,位于 C:\Program Files\Microsoft Visual Studio .NET 2003\VC#\VC#Wizards\CSharpAddClassWiz\Scripts\1033\。
同样,1033 包含美国英语的本地化版本。在这里,你可以为向导添加自己的参数。通过调用来实现向导参数的添加:
wizard.AddSymbol([SYMBOL], [VALUE]);
我们现在要做的是添加逻辑,将当前日期添加到向导参数。备份 JScript 文件,并在 Visual Studio 中打开它。用于添加日期的 JScript 函数将如下所示:
function CreationDate()
{
var Months = new Array("January","February","March","April","May","June",
"July","August","September","October","November","December");
var myDate = new Date();
var currentDate = myDate.getDate()
+"."
+ Months[myDate.getMonth()]
+" "
+myDate.getFullYear();
wizard.AddSymbol("CREATION_DATE",currentDate);
}
这足以创建并将 Date
添加到向导的参数中。我们现在要做的就是在已经定义的 OnFinish()
函数中调用我们的函数:
function OnFinish(selProj, selObj)
{
// [...]
var strSafeProjectName = CreateSafeName(strProjectName);
wizard.AddSymbol("SAFE_PROJECT_NAME", strSafeProjectName);
// add CreationDate() call
CreationDate();
SetTargetFullPath(selObj);
var strProjectPath = wizard.FindSymbol("TARGET_FULLPATH");
var strTemplatePath = wizard.FindSymbol("TEMPLATES_PATH");
// [...]
}
保存 JScript 文件,然后再次尝试使用类向导向你的项目添加一个新类。现在 CREATION_DATE
应该被当前日期替换了。
/// <summary>
/// Comments for Class1.
/// </summary>
/// <remarks>
/// <para>created: 5.May 2005</para>
/// <para>Author : Michael Groeger</para>
/// </remarks>
摘要
我已经向你展示了,通过几个简单的步骤,很容易根据自己的需求调整现有向导。这些步骤是:
- 编辑 C# 类模板 NewCSharpFile.cs。
- 编辑 JScript 文件 default.js 以添加一些新参数。
在下一篇文章中,我将解释如何轻松创建自己的向导。