我编写了一个自定义的 VirtualPathProvider(来源此处),它将从 EmbeddedResources 返回内容,或者如果已被告知在哪里可以找到它,则从原始文件返回内容(这允许您编辑和更新文件而无需重建)。到目前为止,这工作正常。
不工作的是调试。如果我在视图中添加断点,它不会加载符号。我知道为什么这很困难(ASP 编译器如何知道源文件在哪里,以便发现断点?),但我正在寻找一种方法来提示编译器在哪里可以找到源文件。
此处的示例项目:http: //dl.dropbox.com/u/2808109/VppDebugTest.zip
编辑:
我一直在试验通过 VPP 加载的 ASPX 页面,并通过查看编译源(使用David Ebbo 的技术),生成的行 pragma 如下所示:
Line 275: #line 1 "http://server/EmbeddedPage.aspx"
Line 276: this.InitializeCulture();
通常,这些是沿线生成的
Line 275: #line 1 "d:/somesln/someproj/EmbeddedPage.aspx"
不知道对大家有没有帮助...
编辑2:
在大卫把他的代码发给我之后,我做了一些进一步的调查,以下事情似乎是真的:
- 除非引用 system.web(在 VS 2010 中),否则您不能在 .aspx 中设置断点
如果您使用指令创建一个最小的 .aspx 页面
<%@ Page Language="C#" %>
并设置断点,VS 将在源文件中的断点处停止如果您使用指令创建非最小 .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]
它仍然不会在 Razor 视图中的任何断点处停止,不幸的是,这是我真正需要做的!这个 .aspx 的东西可能是一个红鲱鱼。
编辑:
5:如果我在我的 Index.cshtml 中调用 Debugger.Break(),调试器会在反汇编视图中停止,并且根本没有编译指示,不正确或其他
- 如果我在我的视图中手动写入
@{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" }
,则调试将停止在文件中。所以也许解决方案是让我的 VPP 将#line pragma 插入 cshtml 文件本身?