10

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:

デビッドがコードを送ってくれた後、さらに調査を行ったところ、次のことが正しいようです。

  1. system.web が参照されていない限り、.aspx にブレークポイントを設定することはできません (VS 2010 で)
  2. ディレクティブを使用して最小限の .aspx ページを作成し<%@ Page Language="C#" %>、ブレークポイントを設定すると、VS はソース ファイルのブレークポイントで停止します。

  3. ディレクティブを使用して最小ではない .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 に入れると、デバッガーは逆アセンブル ビューで停止し、正しくないかどうかにかかわらず、プラグマがまったくありません。

  1. ビューに手動で書き込む@{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" }と、デバッグされたファイルが停止します。たぶん解決策は、VPP が #line プラグマを cshtml ファイル自体に挿入することでしょうか??
4

2 に答える 2

2

I had the same problem and finally got it working by using a custom RazorHost. It seems that the physical file location is resolved using the HostingEnvironment.MapPath() method which does not return the correct result for embedded files.

What I did:

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
    }
}

As a last step you need to tell ASP.NET which host factory it should use. This is done in the web.config:

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

I know my answer comes a bit late but hopefully someone else can make use of it when stumbling across this question as I did. :)

于 2015-02-28T09:54:50.807 に答える
1

あなたのコードを少しいじってみました。リソースにテスト aspx を追加すると、デバッグは正常に機能しているように見えました。Page_Load で BP を設定することができ、そこで git を実行しました。

私の変更はhttps://github.com/davidebbo/EmbeddedResourceVirtualPathProviderで確認できます

組み込みのケースに集中したかったので、フォールバック ロジックを無効にしたことに注意してください。ただし、違いはないと思います。

私は VS2012 を使用しているため、project/sln もアップグレードする必要がありました (ただし、2010 年でも動作します)。

ASP.NET が http line プラグマを生成する理由は、標準の場所 (つまり、MapPath が返すもの) で物理的な aspx ファイルを見つけることができないためです。実際には、この動作を常にオンにする少し知られた方法があります。セクションで urlLinePragmas=true を設定します (http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.urllinepragmas.aspx)。 .

于 2012-09-05T21:56:44.103 に答える