不能调试通过自定义加载EmbeddedResource意见的VirtualPathProvider(

2019-07-29 10:07发布

我写了一个自定义的VirtualPathProvider(源在这里 ),如果它被告知哪里可以找到它(这可以让你无需重新构建编辑和更新文件),这将返回内容从EmbeddedResources,或从原来的文件。 这是工作的罚款,到目前为止。

什么是不工作是调试。 如果我添加一个断点到视图,它不会加载的符号。 我能看到为什么这是困难的(ASP的编译器怎么能知道那里的源文件,以现货断点?),但我在寻找一种方式来暗示到源文件可以找到的编译器。

示例项目在这里: http://dl.dropbox.com/u/2808109/VppDebugTest.zip

编辑:

我一直在尝试通过VPP加载一个ASPX页面,并通过查看编译源(使用大卫博的技术 ),以及行杂像这样产生的:

Line 275:              #line 1 "http://server/EmbeddedPage.aspx"
Line 276:              this.InitializeCulture();

通常,这些是沿着线产生

Line 275:              #line 1 "d:/somesln/someproj/EmbeddedPage.aspx"

不知道有没有什么帮助任何人,或不...

编辑2:

之后大卫给我发了他的代码,我做了一些进一步的调查和下面的事情似乎是真实的:

  1. 除非是System.Web程序(在VS 2010)引用你不能在一个的.aspx设置断点
  2. 如果创建的指令最小.aspx页面中<%@ Page Language="C#" %> ,并设置一个断点,VS将停止在源文件中的断点

  3. 如果创建一个非最小的.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]

它仍然不会停止在剃刀意见任何断点,这是不幸的是我真正需要的是能够做到! 这东西的.aspx可能是一个红色的鲱鱼。

编辑:

5:如果我把一个呼叫Debugger.Break()到我Index.cshtml,调试器停在反汇编视图,并且没有编译指示在所有的,不正确的或以其他方式

  1. 如果我手动编写@{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" }在我看来,调试将停止在文件中。 所以,也许解决方案是我的VPP插入的#line编译指示到CSHTML文件本身?

Answer 1:

我有同样的问题,终于得到它通过使用自定义RazorHost工作。 看来,物理文件位置使用解决HostingEnvironment.MapPath()不为嵌入文件返回正确结果的方法。

我做了什么:

public class MyCustomRazorHostFactory : WebRazorHostFactory
{
    public override System.Web.WebPages.Razor.WebPageRazorHost CreateHost( string virtualPath, string physicalPath )
    {
        // Implementation stolen from MvcRazorHostFactory :)
        var host = base.CreateHost( virtualPath, physicalPath );

        if( !host.IsSpecialPage )
        {
            return new MyCustomRazorHost( virtualPath, physicalPath );
        }

        return host;
    }
}

public class MyCustomRazorHost : MvcWebPageRazorHost
{
    public MyCustomRazorHost( string virtualPath, string physicalPath )
        : base( virtualPath, physicalPath )
    {
        if( MyMagicHelper.IsEmbeddedFile( virtualPath ) )
        {
            PhysicalPath = MyMagicHelper.GetPhysicalFilePath(virtualPath);
        }
    }
}

// Simplified for demonstration purpose
public static class MyMagicHelper
{
    public static bool IsEmbeddedFile(string virtualPath)
    {
        // ... check if the path is an embedded file path
    }

    public static string GetPhysicalFilePath(string virtualPath)
    {
        // ... resolve the virtual file and return the correct physical file path
    }
}

作为最后一步,你需要告诉ASP.NET,应该使用的主机厂家。 这是在web.config中完成的:

<system.web.webPages.razor>
    <host factoryType="My.Custom.Namespace.MyCustomRazorHostFactory" />
</system.web.webPages.razor>

我知道我的回答来得有点迟,但希望别人能过这个问题,磕磕绊绊,像我一样的时候使用它。 :)



Answer 2:

我试着用你的代码打了一下,当我在资源增加了一个测试的aspx,调试似乎很好地工作。 我能够在Page_Load中设置BP,它的git那里。

你可以看到我的变化https://github.com/davidebbo/EmbeddedResourceVirtualPathProvider

请注意,我禁用了后备逻辑,因为我想专注于嵌入式情况下,虽然我不认为这有差别。

请注意,我用VS2012,所以我也不得不升级项目/ SLN(但他们仍然会在2010年的工作)。

究其原因ASP.NET正在生成HTTP行编译的是,它无法找到在标准位置的物理aspx文件(即什么样的MapPath将返回)。 实际上有一个鲜为人知的方法来总是这种行为转:SET urlLinePragmas = true在部分(http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.urllinepragmas.aspx) 。



文章来源: Cannot debug EmbeddedResource views loaded via custom VirtualPathProvider