5

मैं कोड के माध्यम से Web User Controls बना रहा हूं (मेरा सी # कोड लिखने वाला मार्कअप, कोड-बैक और डिज़ाइनर फ़ाइलों को कॉलबैक पर डिस्क पर)। नियंत्रण सभी ठीक बनाये गये हैं। मैं उन्हें अपने वेब-प्रोजेक्ट में जोड़ सकता हूं और उन्हें एक पेज पर रख सकता हूं।एएससीएक्स नियंत्रण लोड हो रहा है गतिशील रूप से (कोड के माध्यम से)

जब मैं नियंत्रण LoadControl(path) का उपयोग कर इसे कहते हैं लोड करने का प्रयास:

Unable to load type 'MyNameSpace.UseControlClass' 

है जो क्योंकि नियंत्रण अभी तक संकलित नहीं है।

लेकिन मेरी आवश्यकता समाधान को पुन: संकलित किए बिना गतिशील रूप से नियंत्रण लोड करना है।

जब मैं नियंत्रण फाइलें बनाता हूं तो मैं केवल उपयोगकर्ता नियंत्रण को संकलित कैसे कर सकता हूं? जैसा कि यह एकमात्र रास्ता लगता है।

संपादित करें: - मेरा अनुमान है कि फ़ाइल संकलित नहीं है, फिर भी इसे रनटाइम द्वारा लोड करने की अनुमति नहीं है। मैंने CodeDom कंपाइलर का उपयोग कर कोड फ़ाइल को संकलित करने का प्रयास किया है। जैसा:

var filePath = Server.MapPath(path); 
var provider = CSharpCodeProvider.CreateProvider("C#"); 
var opts = new CompilerParameters(new[] { "mscorlib.dll", "System.Web.dll", 
           "Telerik.Web.Design.dll", "Telerik.Web.UI.dll", 
           "Telerik.Web.UI.Skins.dll", "MyCurrentDll.dll"}); 
opts.GenerateExecutable = false; 
opts.GenerateInMemory = true; 
var cr = provider.CompileAssemblyFromFile(opts, new string[] { filePath+".cs" }); 

लेकिन यह शिकायत cannot find metadata file Telerik.Web.Design.dll के बारे में आदि मैं Telerik पथ हार्डकोड करने के रूप में यह की मेजबानी की व्यवस्था में अलग हो सकता है (हालांकि यह वर्तमान वेब एप्लिकेशन के bin में है) नहीं करना चाहती। MyCurrentDll.dll फ़ाइल का डीएलएल है जिसमें से मैं कोड फ़ाइल संकलित कर रहा हूं। मैं इसे कैसे हल करूं?

मेरा विचार कोड फ़ाइल को संकलित करना dll गतिशील रूप से बनाना और इसे वेब एप्लिकेशन की bin निर्देशिका में कॉपी करना है। यह मूल रूप से बताई गई समस्या को हल कर सकता है।

EDIT 2: - हिट और परीक्षण के बाद मैं कोड फ़ाइल को गतिशील रूप से संकलित करने और dll उत्पन्न करने में सक्षम हूं। डीएल उत्पन्न करने और इसे मेरे आवेदन के bin में रखने के बाद भी मैं virtual path का उपयोग कर उपयोगकर्ता नियंत्रण लोड करने में सक्षम नहीं हूं। मैंने निम्नलिखित दृष्टिकोण का प्रयास किया है:

var asm = Assembly.Load("ddlPath"); 
var t = asm.GetType(fullTypeName);//NameSpace.Class 
var ctrl = LoadControl(t,null); 

इसके बाद ctrl लोड किया गया है। मैं अपनी Id संपत्ति असाइन करता हूं और इसे asp.net Panel नियंत्रण में जोड़ता हूं। लेकिन यह पोस्टबैक :(

अब मैं के बाद दिखाई या तो किसी भी तरह गतिशील रूप से संकलित dll के क्रम के लिए उपलब्ध प्रकार (appdomain, हो सकता है) बनाने के लिए इतना है कि जब मैं नियंत्रण लोड आभासी पथ का उपयोग कर इसे ठीक तरह से भरी हुई है और मैं है नहीं है HtmlParseException मिलता है या नहीं यह पता लगाने क्यों लोड हो रहा है नियंत्रण प्रपत्र Type नहीं दिखा रहा है

पुनश्च: -। मैं Type का उपयोग कर एक Label नियंत्रण लोड किया है और यह ठीक से काम कर रहा है

+0

यह वास्तव में एक दिलचस्प सवाल है। मैं इसके लिए उपयोग के मामले के बारे में नहीं सोच सकता - लेकिन जिस तरह से मैं आम तौर पर इस दृष्टिकोण से संपर्क करता हूं वह एक और असेंबली है जो जानता है कि नियंत्रण कैसे बनाएं और एचटीएमएल आदि को रन टाइम पर कैसे निकालें। संभवतः एक और असेंबली में आपके नए नियंत्रणों को एम्बेड करके एक समान दृष्टिकोण संभव होगा जिसे आप संकलित और लोड कर सकते हैं? मैं इस सवाल को ब्याज के साथ देखूंगा! – dash

+0

@ डैश उपयोग केस यह है कि हम उपयोगकर्ता को कुछ फ़ील्ड (पूर्वनिर्धारित इनपुट प्रकारों के साथ) समूहबद्ध करने और अंतिम उपयोगकर्ता से इनपुट प्राप्त करने की अनुमति देते हैं। मैं इन क्षेत्रों को एम्बेड करने, उपयोगकर्ता नियंत्रण बनाना चाहता हूं। – TheVillageIdiot

+0

कोडबहाइंड के बजाय कोडफाइल में आपके नियंत्रण और होस्टिंग पृष्ठ हैं? – jbl

उत्तर

2

अंत में मैं समस्या को हल करने में सक्षम था। पीछा कर रहा है रणनीति मैं अपनाया:

  1. CodeBehind, Markup और Designer कोड
  2. की संरचना वाली टेक्स्ट फ़ाइलों को बनाएं क्या बनाने के लिए क्षेत्रों के लिए के रूप में जानकारी पढ़ें।
  3. स्ट्रिंग बिल्डर्स में आवश्यक नियंत्रणों के लिए मार्कअप रखें।
  4. अधिक स्ट्रिंग बिल्डरों में
  5. लिखें फ़ाइलों

कुछ अन्य संबंधित जानकारी डाल इस के बाद मैं CodeDome संकलक का उपयोग कर dll बनाया। सवाल का Edit भाग में वर्णित के रूप में मुख्य समस्या यह संकलन के दौरान सामना करना पड़ा, संदर्भित विधानसभाओं, जो की तरह dll फ़ाइल नाम के साथ bin निर्देशिका पथ के पथ रख कर हल किया गया था वह नहीं मिल रहा था:

Server.MapPath("~/bin")+"\\Telerik.Web.dll" 

आदि

EDIT2 में उल्लिखित अगली समस्या थोड़ा सरल थी। बल्कि मूर्ख था। गतिशील रूप से जेनरेट किए गए उपयोगकर्ता नियंत्रण में एम्बेडेड किसी अन्य उपयोगकर्ता नियंत्रण में कुछ समस्या थी।

इसके बाद भी मैं उस पृष्ठ में नियंत्रण लोड करने में सक्षम नहीं था जहां से मैंने कोड संकलित किया था। जब मैं किसी अन्य पृष्ठ पर नियंत्रण लोड करता था तो यह हल हो गया था। रनटाइम गतिशील रूप से संकलित dll से प्रकार को हल करने में सक्षम था।

+0

क्या आप अपना उत्तर स्वीकार कर सकते हैं ताकि इसे अनुत्तरित कतार से हटा दिया जा सके? –

1

हम्म .. आप का उपयोग पर विचार किया है। इस उद्देश्य के लिए App_Code folder?

साझा कक्षाओं और व्यावसायिक वस्तुओं ( उदाहरण, ..cs, और .vb फ़ाइलों के लिए) के लिए स्रोत कोड शामिल है जो आप अपने एप्लिकेशन के हिस्से के रूप में संकलित करना चाहते हैं। एक गतिशील रूप से संकलित वेब साइट प्रोजेक्ट में, एएसपी.नेट आपके आवेदन को प्रारंभिक अनुरोध पर App_Code फ़ोल्डर में कोड संकलित करता है। इस फ़ोल्डर में आइटम को फिर से संकलित किया जाता है जब कोई भी परिवर्तनों का पता लगाया जाता है।

+0

यह मेरी सहायता नहीं करेगा क्योंकि मैं उपयोगकर्ता नियंत्रण बना रहा हूं और फ़ाइलों को रनटाइम पर भी गतिशील रूप से बनाया गया है। समस्या नियंत्रण ऑब्जेक्ट बनाने के लिए ऐप डोमेन में बनाई गई फ़ाइलों को लोड करना था। मैंने इसे हल कर लिया है और जल्द ही उत्तर पोस्ट करूंगा। – TheVillageIdiot