Я написал пользовательский VirtualPathProvider (источник здесь), который будет возвращать контент из EmbeddedResources или из исходного файла, если было сказано, где (это позволяет редактировать и обновлять файлы без необходимости их восстановления). Пока все работает нормально.
Что не работает, это отладка. Если я добавлю точку останова в представление, она не загрузит символы. Я могу понять, почему это сложно (как компилятор ASP знает, где находится исходный файл, чтобы определить точки останова?), Но я ищу способ подсказки компилятору, где можно найти исходный файл.
Пример здесь: http://dl.dropbox.com/u/2808109/VppDebugTest.zip
изменить:
Я экспериментировал с ASPX-страницей, загружаемой через VPP, и просмотрел Compiled Source (используя метод Дэвида Эббо) и линейные прагмы генерируются так:
Line 275: #line 1 "http://server/EmbeddedPage.aspx"
Line 276: this.InitializeCulture();
Обычно они генерируются вдоль линий
Line 275: #line 1 "d:/somesln/someproj/EmbeddedPage.aspx"
Не знаю, помогает ли это кому-либо, или нет...
edit 2:
После того, как Дэвид прислал мне свой код, я провел некоторое дальнейшее расследование, и следующие вещи выглядят правдоподобно:
- вы не можете установить точку останова в .aspx, если не указана система system.web(в 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??