2011-02-04 23 views
19

प्रीलोड करने का अच्छा तरीका मेरे ऐप में मुझे माउस क्लिक पर एक फॉर्म दिखाना होगा। समस्या यह है कि यह फॉर्म एक और असेंबली में है और असेंबली लोडिंग की आलसी प्रकृति की वजह से यह संभावना है कि जब तक माउस बटन दबाया जाता है तब तक असेंबली लोड नहीं होती है। तो अंत में प्रपत्र प्रकट होने से पहले मेरे पास जो भी है, वह बहुत ही ध्यान देने योग्य विराम है।.NET असेंबली

मैं अपने प्रारंभ विधि में new FormFromAnotherAssembly() को फोन करके एक गूंगा ठीक साथ आने के लिए सक्षम था। वह, ज़ाहिर है, चीजों का ख्याल रखा और विराम अब नहीं है, लेकिन यह बहुत बदसूरत है। इस समाधान के बारे में मुझे एकमात्र चीज यह है कि मुझे पथ और असेंबली नामों से गड़बड़ नहीं करना पड़ेगा जो मुझे करना है यदि मैं Assembly.Load जैसे कुछ उपयोग करना चाहता हूं। अगर मुझे यकीन है कि इससे पहले कि मैं वास्तव में इसकी जरूरत विधानसभा भरी हुई है बनाना चाहते

तो, क्या अच्छा है, पसंद का मजबूत समाधान है?

अग्रिम धन्यवाद।

+0

आप एक अच्छा समाधान खारिज कर रहे हैं। एकमात्र दूसरा एक तेज़ हार्ड ड्राइव प्राप्त करना है। यदि आपने पिछले 6 महीनों में डिस्क को डिफ्रैग नहीं किया है तो अब एक अच्छा समय है। –

+0

@ हंस पासेंट: कौन सा? – Dyppl

उत्तर

19

आपके init में स्पष्ट प्री-लोड शायद अभी भी आपका सबसे अच्छा विकल्प है। कुछ अपारदर्शी विधि है कि दूर से अनुकूलित नहीं किया जा सकता है के साथ -

एक typeof(SomeTypeFromAnotherAssembly) पर्याप्त होना चाहिए शायद:

GC.KeepAlive(typeof(SomeTypeFromAnotherAssembly)); 

यह new से बचाता है। ध्यान दें कि यह लोड, लेकिन JITted आदि

यदि आप चाहते थे नहीं होगा, तो आप एक बीजी धागे पर यह कर सकता है:

private static void LoadSomeStuff(object state) { 
    GC.KeepAlive(typeof(SomeTypeFromAnotherAssembly)); 
} 
... 
ThreadPool.QueueUserWorkItem(LoadSomeStuff); 
+0

धन्यवाद मार्क, लेकिन अगर मैं इसे लोड और जिट इत्यादि चाहता हूं तो क्या होगा? क्योंकि ऐसा लगता है कि एक असेंबली लोड करना समस्या का केवल एक हिस्सा है और विराम अभी भी वहां है। – Dyppl

+0

@Dyppl - JIT अपेक्षाकृत तेज़ है - मेरा सुझाव है कि समस्या * अन्य * (डाउनस्ट्रीम) असेंबली लोड हो रही है और अन्य संसाधन लोड हो रही है। यदि आप डीबग करते हैं तो आपको यह देखने में सक्षम होना चाहिए कि और क्या लोड होता है ... –

+0

ठीक है, हां, दुर्भाग्य से, फॉर्म एक डब्ल्यूपीएफ है और इसके साथ बहुत सारे बकवास ड्रैग करता है। – Dyppl

1
var yourAppPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
Assembly.Load(Path.Combine(yourAppPath, "formAssembly.dll")); 

ऐसा करेंगे?

+2

यही वह है जिसे मैं "पथ और असेंबली नामों के साथ गड़बड़ाना" कहता हूं, इसलिए नहीं, यह – Dyppl

+0

नहीं करेगा, यह तब तक काम करेगा जब तक कि असेंबली एक ही फ़ोल्डर में हों। तो मैं इसे गड़बड़ के रूप में नहीं देखता। – jgauffin

+0

इसके अलावा, वे एक ही फ़ोल्डर में नहीं हैं – Dyppl

2

मुझे विश्वास है कि Assembly.Load तरीका है।

आवेदन स्टार्टअप के दौरान आप मॉड्यूल, प्लग इन या किसी अन्य रन-टाइम प्लगेबल पता लगाने और आवेदन के डोमेन (AppDomain) में अपने विधानसभाओं लोड करना चाहिए।

या दूसरा और बेहतर विकल्प: आप इसके लिए नियंत्रण में उलटा क्यों नहीं उपयोग करते?

आप इसके लिए कैसल विंडसर का उपयोग कर सकते हैं। आइए मान लें कि आपके पास रन-टाइम में लोड होने के लिए 4 रूप हैं, इसलिए, आप फॉर्म क्लास के 4 घटक बना सकते हैं, जो उनके कार्यान्वयन आपके प्रोग्राम के जीवन-चक्र के दौरान लोड होने के लिए 4 रूप हैं।

इस दृष्टिकोण से पूर्व-लोड कैसे करें? आप बस सभी निर्भरता/घटक है कि फार्म के प्रकार के होते हैं को हल करने और आप समझ में आ गया:

container.ResolveAll<Form>(); 

बाद में आप एक विशेष रूप मिल जाएगा:

container.Resolve<Form>("CustomersForm"); // Just an example 

आप नियंत्रण से उलट पता नहीं है , टिप्पणी करें और मैं आपकी सहायता करूंगा, कोई समस्या नहीं! :)

+0

यह मेरी समस्या के लिए एक ओवरकिल की तरह दिखता है, लेकिन – Dyppl

+0

धन्यवाद, ठीक है, सोचें कि क्या आपके पास बहुत सारे रन-टाइम लोड किए गए फॉर्म हैं। यदि यह स्थिति नहीं है, हाँ, यह आपके लिए अधिक है। –

+0

ठीक है, फिलहाल यह असंभव है, लेकिन वैसे भी धन्यवाद, जब मुझे आवश्यकता हो तो मैं आपके समाधान का प्रयास करूंगा। – Dyppl

0

मुझे लगता है कि विधानसभा में असेंबली नाम का उपयोग करना सबसे आसान तरीका है।लोड(): इस तरह से आप dll फ़ाइल पथ में प्रवेश करने से बच सकते हैं आदि मैं गति के लिए इसका उपयोग

assembly name in visual studio

:

System.Reflection.Assembly.Load("ICSharpCode.AvalonEdit"); 

आप दृश्य स्टूडियो में संदर्भ गुण के तहत विधानसभा नाम देख सकते हैं इस डीएलएल का उपयोग करने वाले संवाद की लोडिंग को ऊपर रखें। जैसे ही कार्यक्रम मुख्य विंडो पूरी तरह से लोड हो जाती है, यह पृष्ठभूमि पृष्ठभूमि को लॉन्च करता है जो सिर्फ विधानसभा को कॉल करता है। लोड()। जब उपयोगकर्ता इस संवाद को खोलता है तो यह डीएलएल लोड करने का छोटा अंतराल चला जाता है।

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