normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

ASP.NET MVCのソースコードをステップイン実行してみる

ASP.NET MVCの内部コードをステップインで実行したい!」という衝動に駆られない人が居るでしょうか!?オープンソースを勉強しようと思ったら、内部のコードをステップイン実行せざるを得ないでしょう。
色々と模索していたのですが、意外にも非常に単純に実現できる事が判明。今回はASP.NET MVCをステップイン実行する方法をまとめてみます(当然自分の備忘録)。

ASP.NET MVCをステップイン実行するまでの流れ

何はともあれ、まずはASP.NET MVCのプロジェクトを作成(この例ではMvcSourceTraceAppという名前のソリューションを作ってます)。

次に、MvcSourceTraceAppプロジェクトの参照する System.Web.Mvcを削除します(この参照はdllとして加工された物を指している為)。

次に、MvcSourceTraceAppソリューションに対して、右クリックメニューから「既存のプロジェクトを追加」を選択します。

ASP.NET MVCソースコード内から、System.Web.Mvc.csprojを選択し、ソリューション内にSystem.Web.Mvcプロジェクトをインポートします(以下参照)。

「プロジェクトをコンバートしろ!」と言われるかもしれませんが、ガンガンコンバートして下さい。

次に、MvcSourceTraceAppプロジェクトから、ソリューション内にインポートしたSystem.Web.Mvcプロジェクトに対して参照を追加して下さい(この処理はテストプロジェクトでもやってねw)。

タブ切り替えて、ソリューション内のSystem.Web.Mvcプロジェクトを選択して下さい。

MvcSourceTraceAppプロジェクト内のweb.configを編集します(編集した部分を抜粋)。System.Web.Mvcアセンブリを追加するタグにて、Versionを2.0.0.0(今後バージョン上がったりなんなりした場合は適宜変更してください)に変更するのと、PublicKeyTokenをnullにして下さい(厳密にアセンブリ指定をしても仕方ないので)。

    <compilation debug="true" targetFrameworkMoniker=".NETFramework,Version=v4.0">

      <assemblies>


        <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <!-- 
        <add assembly="System.Web.Mvc, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        -->
        <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        <add assembly="System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />

      </assemblies>
    </compilation>

ASP.NET MVCアプリ実行前に、System.Web.Mvcプロジェクトのソース内にブレークポイントを置いてみる(この例ではControllerActionInvoker.cs内に置いてます)。

設定し終わったASP.NET MVC アプリを実行すると、初回アクセス時に例外が発生します。しかし、よく見ると「favicon.ico」に対するリクエストの例外なので、平然と無視してF5を押してください。

F5を押して処理を進めると、以下のようにブレークポイントに止まってくれます。あとはF11でステップイン実行も思うがまま!これで内部を追ってASP.NET MVCをハックできるね!!!