मेरे पास एक पुस्तकालय है जिसमें एक अमूर्त वर्ग है - मान लें MyAbstractClass। इस पुस्तकालय का उपयोग कुछ अन्य परियोजनाओं (एक ऐप) द्वारा एक समाधान के भीतर किया जा रहा है।

मैं इन सभी वर्गों को प्राप्त करना चाहता हूं। मैंने नमूना Program प्रोजेक्ट और Program.Library बनाया है जिसमें MyAbstractClass है।

मैंने MyAbstractClass से प्राप्त दो परीक्षण कक्षाएं बनाई हैं। पहली परियोजना में एक (Test1Class) और दूसरी में एक (Test2Class)।

मैंने इस कोड की कोशिश की कि मुझे क्या चाहिए:

var list = Assembly.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
                                .Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof (MyAbstractClass)));

यह काम किया लेकिन केवल Test1Class पाया गया (क्योंकि - मुझे लगता है - इसे उसी विधानसभा में रखा गया है जहां ऊपर दिए गए कोड को निष्पादित किया गया है?)। मुझे नहीं पता कि मेरे पूरे ऐप में सभी असेंबली के भीतर सभी व्युत्पन्न वर्ग को कैसे खोजना है।

मैंने भी कोशिश की है:

var list = Assembly.GetAssembly(typeof(MyAbstractClass)).GetTypes()
                                .Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof (MyAbstractClass)));

लेकिन यह मुझे एक खाली संग्रह देता है ...

1
Nickon 24 नवम्बर 2015, 11:28

2 जवाब

सबसे बढ़िया उत्तर

आपको यह सुनिश्चित करने की आवश्यकता है कि जब आप Assembly.CurrentDomain.GetAssemblies() कॉल करते हैं, तो वे सभी असेंबली जिन्हें आप पहले से लोड करना चाहते हैं; असेंबली लोड हो जाती है जब रनटाइम की आवश्यकता होती है (यानी जब आपका प्रोग्राम आपके कोड में एक बिंदु तक पहुंचता है जो उस असेंबली का "उपयोग" करता है, या यदि आप विशेष रूप से {{एक्स 1}} या {एक्स 2}} या जिस भी विधि का उपयोग कर सकते हैं उसे कॉल करते हैं। स्पष्ट रूप से इसे लोड करने के लिए

1
Gian Paolo 24 नवम्बर 2015, 08:46

समस्या CurrentDomain.GetAssemblies () केवल आपके अनुप्रयोग डोमेन में लोड की गई असेंबली को सूचीबद्ध करती है। यदि आप अपने आवेदन में सभी विधानसभाओं में प्रकार प्राप्त करना चाहते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है (किसी तरह) कि सभी विधानसभाएं भरी हुई हैं।

कोड को निम्न पंक्ति का उपयोग करने के लिए विधानसभाओं को मैन्युअल रूप से लोड करने का एक तरीका है:

var assembly = Assembly.LoadFile(@filename)

आपको प्रत्येक फ़ाइल के लिए उपरोक्त करने की आवश्यकता होगी, और फिर आप CurrentDomain.GetAssemblies () विधि का उपयोग कर सकते हैं।

1
Don 24 नवम्बर 2015, 08:46