自动化 Visual Studio 自定义工具的注册






2.83/5 (3投票s)
2004年6月3日
3分钟阅读

60999

402
描述一个简化 VS.NET 自定义工具注册的实用程序。
引言
正如 Chris Sells 指出的那样,Visual Studio 自定义工具是 IDE 的一个出色功能 (MSDN)。 每当您从 XSD 创建类型化的 DataSet
时,您都在使用 Microsoft 自定义工具代码生成器 MSDataSetGenerator
。在编写了几个 Visual Studio 自定义工具代码生成器(稍后将发表文章)后,我一直在寻找一种简单的方法来为 COM 互操作注册它们,并进行 Visual Studio 所需的注册表项。我还希望能够无缝地在安装程序包中执行此注册。此实用程序就是结果。
通过使用简单的 XML 模板或命令行参数,此可执行文件将为 COM 和自定义工具注册代码生成器。您只需要提供 4 条信息
- 您要注册的程序集的名称。
- 您要用于自定义工具的名称。
- 自定义工具的类 ID GUID。
- 要在注册表中描述您的工具的描述性文本。
给定这一点,注册工具将向您显示一个窗口,其中包含当前活动及其状态。
XML 模板
<?xml version="1.0" encoding="utf-8" ?>
<dotNetRegistration
xmlns="http://schemas.mckechney.com/DotNetRegistrationConfig.xsd">
<dllName>SimpleDataClassVSGenerator.dll</dllName>
<customToolName>SimpleDataClassGenerator</customToolName>
<guid>{34EAC568-72B1-439e-BE3F-C1D0ADF50CE9}</guid>
<prodDesc>Simple DataClass Generator by Michael McKechney</prodDesc>
</dotNetRegistration>
这是一个我用来注册我编写的自定义工具的模板文件示例。默认情况下,应用程序查找名为 DotNetRegistrationConfig.xml 的文件,但您可以通过命令行参数指定不同的名称。它非常简单,具有以下定义
dllName
- 要注册的程序集的名称(在当前版本中,应用程序假定程序集与自身位于同一目录中。由于这通常作为安装包自定义操作运行,因此我没有看到更改它的必要性)。customToolName
- 最终用户将在项目文件的“自定义工具”属性中键入的内容。guid
- 您已分配给生成器的类 ID GUID(这就是 VS.NET 注册表项查找 DLL 的方式)。prodDesc
- 自定义工具将在 VS.NET 注册表中如何描述。
注册表模板文件
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\
7.1\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\<<G
eneratorName>>]
"CLSID"="<<guid>>"
"GeneratesDesignTimeSource"=dword:00000001
@="<<DefaultKeyValue>>"
此文件(DotNetRegistration.reg,也应与可执行文件位于同一目录中)充当自定义工具的注册表模板。双括号中的项目将替换为 XML 值,因为它已处理。需要注意的几点:7.1
值指定这将注册为 Visual Studio .NET 2003 的自定义工具。您需要针对不同的版本更改它。其次,GUID 值 {FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}
用于 C# 代码生成器。如果您查看 Generators
键,您会发现几个不同的 GUID,代表不同的语言。如果您想为另一种语言注册代码生成器,则需要更改此值。
使用代码
此工具的显示是一个简单的 Windows 窗体,带有 ListView
,因此我不会详细介绍。所有实际操作都发生在 CompleteRegistration
方法中。使用一些反射和 RunTime 方法,我首先检索运行目录,
string full = System.Reflection.Assembly.GetExecutingAssembly().Location;
以及正在使用的 .NET 运行时根目录
string dotNetRoot =
System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();
接下来,我确保一切都在其应该在的地方,如果它们不在,则失败
if(!File.Exists(dotNetRoot + "regasm.exe"))
{
MakeListEntry("Unable to locate regasm.exe",false,true);
Thread.Sleep(new TimeSpan(0,0,5));
throw new ApplicationException("Install Failed");
}
//Make sure the Assembly to register is present and accounted for
if(!File.Exists(currentDir+dllName))
{
MakeListEntry("Unable to locate "+currentDir+dllName,false,true);
MakeListEntry("** Installation Failed **",true,true);
MessageBox.Show(currentDir+dllName);
Thread.Sleep(new TimeSpan(0,0,5));
throw new ApplicationException("Install Failed");
}
然后,使用 System.Diagnostics.Process
类,我开始运行注册步骤
//Register the Type library for the Assembly
prc.StartInfo.FileName = dotNetRoot + "regasm.exe";
prc.StartInfo.Arguments = "/tlb \""+ currentDir+dllName+"\"";
prc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
prc.StartInfo.WorkingDirectory = dir;
prc.Start();
prc.WaitForExit();
//etc...
在每个步骤成功或失败后,ListView
将更新其状态。完成后,窗口关闭并返回状态码 0 表示成功,100 表示失败。如果成功,您的自定义工具就可以使用了!在准备有关代码生成的文章时,您将看到我如何将此工具用作安装程序包中的自定义操作,以无缝安装自定义工具代码生成器。