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

构建 Reflector 插件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (26投票s)

2003年7月8日

CPOL

5分钟阅读

viewsIcon

309294

downloadIcon

3514

将 Reflector 制成 Visual Studio.NET 插件

Sample Image - maximum width is 600 pixels

引言

本文将介绍如何将 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
© . All rights reserved.