构建 Reflector 插件






4.93/5 (26投票s)
将 Reflector 制成 Visual Studio.NET 插件
引言
本文将介绍如何将 Lutz Roeder 的 .NET Reflector 制成 Visual Studio.NET 的插件。它将使用 ManagedAddIns 框架来实现。
背景
我开始编写 ManagedAddIns 框架是因为 NUnitAddIn(一个我一直在开发的单元测试插件项目)开始变得难以管理。我一直在使用 VS.NET 2002 进行开发,但它在 2002 和 2003 版本上已经运行了一段时间。我希望开始使用 VS.NET 2003 进行开发,同时保持与 2002 的兼容性。
给心急的人
如果您心急,只想看到 Reflector 插件运行 - 这里是方法。安装最新版本的 ManagedAddIns.msi。您只需要做这些!新版本包含了 Reflector 插件(请确保先卸载任何旧版本)。转到“工具/托管插件...”菜单,然后选择 Reflector 插件。第一次加载 Reflector 插件时,它会提示您下载 Reflector。下载完成后,Reflector 应该会出现在一个工具窗口中。
使用代码
该插件分三个阶段开发,复杂程度从拖放式到编写使用 Reflector SDK 的代码不等。每个阶段都有一个功能齐全的插件,集成的程度也不同。
最基本的功能是 ManagedAddIns 允许您运行几乎任何 Windows 窗体应用程序作为 VS.NET 插件。只需从 VS.NET 的“工具”菜单中选择“托管插件...”即可。插件工具箱应该会出现(如果它出现在屏幕中间,请将其停靠)。您可以使用它来添加、连接和配置您的插件应用程序。要将 Reflector 作为插件运行,只需将 Reflector.exe 拖到工具箱上(如果想保留,请单击“保存”)。要启动应用程序,请双击或右键单击“连接” Reflector 条目。此时,Reflector 应该出现在 VS.NET 的一个工具窗口中。您已准备好停靠工具窗口并开始进行反射。
有很多应用程序中,这可能就是您所需要做的全部。只需拖放并开始作为插件运行。另一方面,也有许多应用程序以与 Visual Studio 类似的方式使用工具窗口。虽然这些可以作为托管插件正常工作(特别是如果您取消勾选其工具窗口上的“可停靠”选项),但它们不如它们可以实现的那样集成。在许多情况下,您可以进行一些调整,使工具窗口显示为 VS.NET 工具窗口。这是通过在应用程序的 .config 文件中声明工具窗口来完成的。Reflector 就是这些应用程序之一,它的工具窗口可以声明如下。
<?xml version="1.0" ?>
<configuration>
<configSections>
<section name="managedAddIns"
type="MutantDesign.ManagedAddIns.ManagedAddInsConfiguration,
MutantDesign.ManagedAddIns" />
</configSections>
<managedAddIns>
<managedAddIn name="Reflector">
<toolWindows>
<toolWindow type="Reflector.UserInterface.ToolWindow" />
</toolWindows>
</managedAddIn>
</managedAddIns>
</configuration>
如您所见,定义了一个“managedAddIns”配置节。您需要将 'Program Files\ManagedAddIns\' 目录下的 'MutantDesign.ManagedAddIns.dll' 复制到您的应用程序目录中。在这种情况下,所有类型为 'Reflector.UserInterface.ToolWindow' 的控件都将被创建为 Visual Studio 工具窗口。控件的“Text”属性将与工具窗口的标题保持同步,并且在控件可见时,工具窗口将被激活。
当控件是容器并且您希望控件的“Text”属性用作工具窗口的标题时,这种工具窗口效果很好。在某些情况下,您可能希望控件本身(而不是其内容)由工具窗口进行父化。在这种情况下,您可以按如下方式声明工具窗口。这将把名为“testSuiteTreeView”的控件放在一个标题为“Test Suite”的工具窗口中。
<toolWindow name="testSuiteTreeView" child="true" caption="Test Suite" />
此时,Reflector 正在 VS.NET 中运行,但它对此一无所知。如果我们能够右键单击一个方法并让 IL 出现在 Reflector 中,那不是很棒吗?甚至更好的是,右键单击一个 VB 方法并将其反编译为 C#? ;) 为此,我们需要使用 Reflector SDK 钩入 Reflector 的内部。我们将编写一个 Reflector 插件来连接到我们的 VS.NET 插件!要创建 Reflector 插件,必须实现 Reflector.ComponentModel.IPackage 接口。
public interface IPackage
{
void Load(IServiceProvider serviceProvider);
void Unload();
}
第一个小问题是 Reflector 是一个 EXE 文件,在 VS.NET 中编译 EXE 文件并不容易。您可以做的是将 Reflector.exe 重命名为 Reflector.dll,并将其添加到您的项目引用中。完成此操作后,退出 Visual Studio 并编辑 .csproj 文件。将对 Reflector.dll 的引用(以及文件本身)重命名回 Reflector.exe。完成此操作后,您就可以开始编写 Reflector 插件了。
要使用我之前编写的 Reflector .config 和插件源代码,请将其解压到 Reflector 的同一目录下。预编译的“Reflector.VSAddIn.dll”只能与 Reflector 的 3.2.5.0 版本一起使用。如果您使用的是不同版本,则必须重新编译(它最近变化很多,请务必检查!)。将 Reflector 添加到托管插件工具箱,然后双击/连接它。在 Reflector 加载到 VS.NET 后,选择 Reflector 的“工具/插件...”菜单项。选择“添加...”并添加“Reflector.VSAddIn.dll”插件。
此时,Reflector 的上下文菜单项应该会出现在 VS.NET 代码的上下文菜单上。您现在可以反汇编、反编译和概述您的代码。最重要的是,您可以将其用作起点,对您正在调用的代码执行相同的操作!
关注点
如果您希望 Reflector 插件(或任何其他插件)始终加载,则需要编辑“Program Files\ManagedAddIns.exe.config”文件。将相关“managedAddIn”元素上的“startup”属性更改为 true。它应该看起来像这样。
<managedAddInRef assemblyFile =
"C:\Program Files\Reflector\.NET Framework 1.1\Reflector.exe"
startup="true" />
您还可以将基于 URL 的应用程序添加到托管插件工具箱。例如,您可以通过添加以下 URL 来运行 Chris Sells 的 Wahoo! 游戏作为插件。
http://www.sellsbrothers.com/wahoo/wahoo.exe