Я написал собственный VirtualPathProvider (источник here), который будет возвращать содержимое из EmbeddedResources или из исходного файла, если ему было сказано, где его найти (это позволяет редактировать и обновлять файлы без необходимости перестроить). Пока все работает нормально.Не удается отладить просмотры EmbeddedResource, загруженные с помощью пользовательского VirtualPathProvider
Что не работает, это отладка. Если я добавлю точку останова в представление, она не загрузит символы. Я понимаю, почему это сложно (как компилятор ASP знает, где находится исходный файл, чтобы определить точки останова?), Но я ищу способ подсказки компилятору, где можно найти исходный файл.
Пример проекта здесь: http://dl.dropbox.com/u/2808109/VppDebugTest.zip
редактировать:
Я экспериментировал с страницы ASPX, загруженной через VPP, и просмотрев Составитель Источник (с использованием David Ebbo's technique), а линия псевдокомментарии генерируются как так:
Line 275: #line 1 "http://server/EmbeddedPage.aspx"
Line 276: this.InitializeCulture();
Обычно, они образуются вдоль линий
Line 275: #line 1 "d:/somesln/someproj/EmbeddedPage.aspx"
Не знаю, поможет ли это кому или нет ...
редактировать 2:
После Давид прислал мне свой код, я сделал некоторые дополнительные исследования и следующие вещи кажутся, чтобы быть правдой:
- вы не можете установить точку останова в .aspx, если system.web не упоминается (в VS 2010)
если вы создаете минимальную страницу .aspx с директивами
<%@ Page Language="C#" %>
и установить контрольную точку, В.С. остановится на breakpoi нт в исходном файле, если создать не минимальный .aspx с директивами
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="VppDebugTest.WebForm1" %>
и установить контрольную точку, если смотреть VS приведет вас к dissasembly зрения отладки
--- 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]
It по-прежнему не останавливаются ни на каких контрольных точках в представлениях Razor, что, к сожалению, я действительно должен уметь делать! Этот материал .aspx может быть красной селедкой.
редактировать:
5: Если я ставлю вызов Debugger.Break() в моем Index.cshtml, отладчик останавливается в целях разборки, и нет псевдокомментарии вообще, неправильно или иначе
- Если я вручную напишу
@{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" }
, на мой взгляд, отладка остановится в файле. Так, может быть, решение для моего VPP вставить прайсы #line в сами файлы cshtml ??
В вашем прилагаемом проекте, каковы точные шаги, которые приводят к просмотру? например к чему я отношусь, когда я прикрепляю, где я устанавливаю BP и т. д. –
Установите точку останова внутри index.cshtml (например, в строке @ ViewBag.Message), и отладчик не остановится там, если вы запустите проект. Добавьте вызов в Debugger.Break(), и вы получите разборку, а не исходный код. – mcintyre321
Хммм, это странно. Сгенерированный файл в этом случае не содержит никаких прагм! Обратите внимание, что генераторы кода для страниц aspx и cshtml (aka Razor) совершенно разные, поэтому это может быть проблемой, характерной для Razor. –