EmbeddedResources からコンテンツを返すカスタム VirtualPathProvider (ソースはこちら) を作成しました。または、元のファイルの場所が指定されている場合は元のファイルから返します (これにより、再構築することなくファイルを編集および更新できます)。これまでのところ、これはうまく機能しています。
機能していないのはデバッグです。ビューにブレークポイントを追加すると、シンボルが読み込まれません。これが難しい理由はわかります (ブレークポイントを見つけるために、ASP コンパイラはソース ファイルの場所をどのように知ることができますか?)、ソース ファイルがどこにあるかをコンパイラに示す方法を探しています。
サンプル プロジェクトはこちら: http://dl.dropbox.com/u/2808109/VppDebugTest.zip
編集:
私は VPP 経由で読み込まれた ASPX ページで実験を行っており、( David Ebbo の手法を使用して) コンパイル済みソースを表示することで、行プラグマは次のように生成されます。
Line 275: #line 1 "http://server/EmbeddedPage.aspx"
Line 276: this.InitializeCulture();
通常、これらは次の行に沿って生成されます。
Line 275: #line 1 "d:/somesln/someproj/EmbeddedPage.aspx"
それが誰かに役立つかどうかはわかりません...
編集2:
デビッドがコードを送ってくれた後、さらに調査を行ったところ、次のことが正しいようです。
- system.web が参照されていない限り、.aspx にブレークポイントを設定することはできません (VS 2010 で)
ディレクティブを使用して最小限の .aspx ページを作成し
<%@ Page Language="C#" %>
、ブレークポイントを設定すると、VS はソース ファイルのブレークポイントで停止します。ディレクティブを使用して最小ではない .aspx を作成し
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="VppDebugTest.WebForm1" %>
、ブレークポイントを設定すると、VS を表示すると逆アセンブリ デバッグ ビューが表示されます。
--- http://server/WebForm1.aspx ------------------------------------------------
0000003a mov ecx,dword ptr [ebp-3Ch]
0000003d call 63EC54F0
00000042 mov dword ptr [ebp-44h],eax
00000045 mov edx,dword ptr ds:[03E62200h]
0000004b mov ecx,dword ptr [ebp-44h]
Razor ビューのブレークポイントで停止することはありません。残念ながら、これは本当に必要なことです。この .aspx はニシンかもしれません。
編集:
5: Debugger.Break() への呼び出しを Index.cshtml に入れると、デバッガーは逆アセンブル ビューで停止し、正しくないかどうかにかかわらず、プラグマがまったくありません。
- ビューに手動で書き込む
@{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" }
と、デバッグされたファイルが停止します。たぶん解決策は、VPP が #line プラグマを cshtml ファイル自体に挿入することでしょうか??