10

मैं एक कस्टम VirtualPathProvider लिखा है (स्रोत here) जो सामग्री वापस आ जाएगी EmbeddedResources से, या मूल फ़ाइल से अगर यह जहां यह लगता है (इस प्रकार आप को संपादित करने और अद्यतन करने की अनुमति देता बताया जा चुका है डिबग नहीं कर सकते बिना पुनर्निर्माण के फाइलें)। यह अभी तक ठीक काम कर रहा है।EmbeddedResource विचारों कस्टम के माध्यम से भरी हुई VirtualPathProvider

काम नहीं कर रहा है डीबगिंग है। यदि मैं दृश्य में ब्रेकपॉइंट जोड़ता हूं, तो यह प्रतीकों को लोड नहीं करता है। मैं देख सकता हूं कि यह क्यों मुश्किल है (एएसपी कंपाइलर कैसे पता लगा सकता है कि ब्रेकपॉइंट्स को स्पॉट करने के लिए स्रोत फ़ाइल कहां है?), लेकिन मैं संकलक को संकेत देने का एक तरीका ढूंढ रहा हूं जहां स्रोत फ़ाइल मिल सकती है।

उदाहरण यहाँ परियोजना: http://dl.dropbox.com/u/2808109/VppDebugTest.zip

संपादित करें:

मैं वीपीपी के माध्यम से भरी हुई एक ASPX पेज के साथ प्रयोग किया गया है, और देखने के संकलित स्रोत (David Ebbo's technique का प्रयोग करके) द्वारा, और रेखा pragmas उत्पन्न कर रहे हैं इसलिए जैसे:

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

आम तौर पर, इन

Line 275:    #line 1 "d:/somesln/someproj/EmbeddedPage.aspx" 
की तर्ज पर उत्पन्न कर रहे हैं

जानते हैं न कि अगर किसी को भी मदद करता है, या नहीं ...

संपादित 2:

के बाद दाऊद ने मुझे अपने कोड भेजा, मैं कुछ आगे की जांच पड़ताल किया है और निम्नलिखित बातें सच होने लगते हैं:

  1. आप एक .aspx में एक ब्रेकपाइंट सेट नहीं कर सकता जब तक कि system.web (वी.एस. 2010 में)
  2. आप एक ब्रेकपाइंट निर्देशों <%@ Page Language="C#" %> साथ एक न्यूनतम .aspx पेज बना सकते हैं और निर्धारित करते हैं, वी.एस. संदर्भित है ब्रेकपोई पर रुक जाएगा स्रोत फ़ाइल में NT

  3. अगर आप निर्देशों <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="VppDebugTest.WebForm1" %> के साथ एक गैर न्यूनतम .aspx एक ब्रेकपाइंट बना सकते हैं और निर्धारित करते हैं, जब देखी वी.एस. आप 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 में करने के लिए एक फोन कर दिया, डिबगर disassembly के दृश्य पर बंद हो जाता है, और वहाँ सभी में कोई pragmas कर रहे हैं, गलत या अन्यथा

  1. यदि मैं अपने दृश्य में मैन्युअल रूप से @{ #line 1 "C:\Users\Harry\Desktop\VppDebugTest\VppDebugTest.Views\Views\Home\Index.cshtml" } लिखता हूं, तो डीबग फ़ाइल में रुक जाएगा। तो हो सकता है कि समाधान मेरे वीपीपी के लिए cshtml फाइलों में #line pragmas डालने के लिए है ??
+0

आपके संलग्न प्रोजेक्ट में, रेपो को देखने के लिए कौन से सटीक कदम हैं? जैसे मैं किस पर नेविगेट करता हूं, मैं कब संलग्न करता हूं, मैं बीपी कहां सेट कर सकता हूं, आदि ... –

+0

index.cshtml के अंदर ब्रेकपॉइंट सेट करें (उदाहरण के लिए @ व्यूबैग.मेसेज लाइन पर) और यदि आप चलाते हैं तो डीबगर वहां नहीं रुक जाएगा परियोजना। डीबगर। ब्रेक() में एक कॉल जोड़ें और आपको स्रोत कोड नहीं, डिस्सेप्लर प्राप्त करें। – mcintyre321

+0

हम्म, यह अजीब है। इस मामले में जेनरेट की गई फाइल में कोई भी प्रागमास नहीं है! ध्यान दें कि एएसपीएक्स और सीएसटीएमएल (उर्फ रेजर) पृष्ठों के लिए कोड जनरेटर पूरी तरह से अलग हैं, इसलिए यह रेजर के लिए विशिष्ट समस्या हो सकती है। –

उत्तर

2

मुझे एक ही समस्या थी और आखिरकार इसे एक कस्टम रेजरहोस्ट का उपयोग करके काम करना पड़ा। ऐसा लगता है कि भौतिक फ़ाइल स्थान 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

वाह महान, मैं देखता हूं कि अगर मैं एक मौका मिलता हूं तो मैं इसे अपने nuget पैकेज में एकीकृत कर सकता हूं – mcintyre321

+1

इसे करने के लिए दौर और यह काम करता है !!! मैंने https://gist.github.com/mcintyre321/ff67ffa8e2f0c8ef86da पर विधियों को लागू करने के लिए मेरे एंबेडेड रिसोर्स VirtualPathProvider प्रोजेक्ट पर कुछ गुणों का खुलासा किया है – mcintyre321

1

मैंने आपके कोड के साथ थोड़ा सा खेलने की कोशिश की, और जब मैंने संसाधनों में एक परीक्षण एएसपीएक्स जोड़ा, तो डीबगिंग ठीक काम करने के लिए दिखाई दी। मैं पेज_लोड में बीपी सेट करने में सक्षम था, और यह वहां गिट लगा।

आप में https://github.com/davidebbo/EmbeddedResourceVirtualPathProvider

ध्यान दें कि मैं विकलांग वापस आने तर्क के रूप में मैं, एम्बेडेड मामले पर ध्यान केंद्रित करने, हालांकि मुझे नहीं लगता कि एक फर्क नहीं पड़ता है चाहता था मेरी परिवर्तन देख सकते हैं।

ध्यान दें कि मैं वीएस2012 का उपयोग कर रहा हूं, इसलिए मुझे परियोजना/एसएलएन को अपग्रेड करना पड़ा (लेकिन वे अभी भी 2010 में काम करेंगे)।

कारण एएसपी.NET http लाइन प्रज्ञा उत्पन्न कर रहा है यह है कि यह मानक स्थान पर भौतिक एएसपीएक्स फ़ाइल नहीं ढूंढ सकता है (यानी मैपपाथ क्या करेगा)। इस व्यवहार को हमेशा चालू करने के लिए वास्तव में एक छोटा ज्ञात तरीका है: अनुभाग में urlLinePragmas = सत्य सेट करें (http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.urllinepragmas.aspx) ।

+0

इस पर ध्यान देने के लिए धन्यवाद! आपने कुछ रोचक चीजें उठाई हैं, मैं उन्हें प्रतिबिंबित करने के लिए प्रश्न अपडेट करूंगा। – mcintyre321

+0

क्या कोई तरीका है कि मैं लुकअप एएसपी में हुक कर सकता हूं urlLinePragmas के लिए कर रहा है और बताएं कि असली स्रोत फ़ाइल कहां है? (क्या यह रेजर दृश्यों के साथ मेरी समस्या को ठीक करेगा) – mcintyre321

संबंधित मुद्दे