10

EmbeddedResourcesのコンテンツを返すカスタムVirtualPathProvider(ソースhere)を作成しました。見つかった場合は、オリジナルのファイルから編集して更新できますファイルを再構築する必要はありません)。今のところこれはうまくいきます。カスタムVirtualPathProvider経由で読み込まれたEmbeddedResourceビューをデバッグできません

デバッグは機能しません。ビューにブレークポイントを追加すると、シンボルがロードされません。私はこれがなぜ難しいのか分かります(ASPコンパイラはブレークポイントを見つけるためにソースファイルがどこにあるかを知ることができますか?)。しかし、ソースファイルがどこにあるのかコンパイラをヒントする方法を探しています。ここ

例プロジェクト:http://dl.dropbox.com/u/2808109/VppDebugTest.zip

編集:私はVPPを経由してロードされたASPXページを試してきました

、および(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

編集...知ってはいけません。 system.webが参照されていない限り、あなたはディレクティブ<%@ Page Language="C#" %>で最小限の.aspxページを作成して、ブレークポイントを設定する場合は、(VS 2010で).aspxの中にVSを

  • をブレークポイントを設定することはできません

    1. ブレポイで止まるあなたはブレークポイントをディレクティブ<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="VppDebugTest.WebForm1" %>と非最小限の.aspxを作成し、設定している場合、NTソースファイル内の

    2. 、見たとき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:私は私のIndex.cshtmlにDebugger.Break()の呼び出しを入れた場合、デバッガは解体ビューで中止され、プラグマが全く存在しない、正しくないか、そうでなければ

    1. 私が手動で@{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" }を書き込むと、デバッグはファイル内で停止します。ですから、私のVPPが#lineプラグマをcshtmlファイル自体に挿入するのが解決策ですか?
  • +0

    添付のプロジェクトでは、再現を確認するための正確な手順は何ですか?例えば何をナビゲートすればいいですか、いつどこでBPなどを設定しますか? –

    +0

    index.cshtml内にブレークポイントを設定します(たとえば、@ ViewBag.Message行で)、実行するとデバッガはそこで停止しませんプロジェクト。 Debugger.Break()への呼び出しを追加すると、ソースコードではなく、逆アセンブリが発生します。 – mcintyre321

    +0

    うーん、これは変です。この場合、生成されたファイルにはプラグマがまったく含まれていません。 aspxとcshtml(別名Razor)ページのコードジェネレータはまったく異なるので、Razor固有の問題である可能性があります。 –

    答えて

    2

    私は同じ問題を抱え、最終的にカスタム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> 
    

    私は私の答えを知っているが、私が行ったように、この質問を越えつまずくとき少し遅れてうまくいけば他の誰かがそれを利用することができています。 :)

    +0

    すごい偉大な、チャンスを得たときにこれを私のナゲットパッケージに統合できるかどうかわかります – mcintyre321

    +1

    私は、埋め込みリソース仮想パスプロバイダープロジェクトのいくつかのプロパティを公開して、メソッドを実装しました.gistをhttps://gist.github.com/mcintyre321/ff67ffa8e2f0c8ef86daで公開しました。 – mcintyre321

    1

    あなたのコードで少し試してみましたが、リソースにテスト用のaspxを追加したときに、デバッグがうまくいくように見えました。 Page_LoadにBPを設定できました。

    あなたは、私はそれが違いを考えていませんが、埋め込まれた場合に注力したいと私はフォールバックロジックを無効https://github.com/davidebbo/EmbeddedResourceVirtualPathProvider

    注意の私の変化を見ることができます。

    私はVS2012を使用しているので、プロジェクト/ slnもアップグレードしなければならないことに注意してください(ただし、2010年もまだ動作します)。

    ASP.NETがhttpラインプラグマを生成する理由は、標準の場所(つまり、MapPathが返すもの)で物理的なaspxファイルを見つけることができないためです。実際にはこの動作を有効にする方法はほとんどありません。set urlLinePragmas = true(http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.urllinepragmas.aspx) 。

    +0

    これを見ていただきありがとうございますあなたはいくつかの興味深い事柄を提起しました、それらを反映するために質問を更新します – mcintyre321

    +0

    私はルックアップASPにフックできるいくつかの方法はありますかurlLinePragmasのためにやっていて、実際のソースファイルがどこにあるのかを教えてください。(これは私のRazorビューの問題を解決しますか?) – mcintyre321

    関連する問題