2011-06-15 15 views
5

में कस्टम जानकारी शामिल करें मैं एक एक्स्टेंसिबल एप्लिकेशन बना रहा हूं जो Assembly.LoadFile() के माध्यम से रनटाइम पर अतिरिक्त असेंबली लोड करेगा। उन अतिरिक्त असेंबली में डब्ल्यूपीएफ संसाधन शब्दकोश (खाल, इत्यादि), सादे संसाधन (रेक्स), और/या प्लगइन कक्षाएं जैसी चीजें होंगी। असेंबली में कोई सार्वजनिक कक्षाएं, केवल संसाधन या संसाधन शब्दकोश भी हो सकते हैं।नेट 4 - असेंबली

मैं एक असेंबली की पहचान करने के लिए एक तरीका ढूंढ रहा हूं, जैसे दोस्ताना नाम (जैसे "अतिरिक्त खाल" या "एकीकृत ब्राउज़र"), एक असेंबली के कार्यात्मक प्रकार (स्किन्स लाइब्रेरी, स्किन्स लाइब्रेरी | प्लगइन लाइब्रेरी, आदि) और अतिरिक्त जानकारी (जैसे ConflictsWith (नया [] {"स्किन्स लाइब्रेरी", "ब्राउज़रप्लगिन")

अब तक मैं असेंबली नामांकन में एक सम्मेलन का उपयोग कर रहा हूं (*.Skins.*.dll, आदि)। प्रत्येक असेंबली में मेरे पास खाली, डमी है क्लास जो कस्टम क्लास एट्रिब्यूट्स के लिए प्लेसहोल्डर है, जो वास्तविक (असेंबली-व्यापी) जानकारी रखती है, लेकिन यह हैक की तरह लगता है। क्या इसमें कुछ सुव्यवस्थित, मानक तरीका है इसे संभालने के लिए?

मैं विकसित कर रहा हूं मेरी लोडर में केंद्रीय लोडर सिस्टम और अन्य डेवलपर उन अतिरिक्त असेंबली विकसित करेंगे, इसलिए मैं सम्मेलनों और नलसाजी विवरण को कम करना चाहता हूं।

+0

यदि आपके पास "डिफ़ॉल्ट" संसाधन परिभाषित किया गया है, तो प्रोसेसरी नाम (name.lang.resx) को वर्तमान भाषा के लिए स्वचालित रूप से लोड किया जाना चाहिए। फ्रेमवर्क आपके लिए करता है। आपको संसाधनों को मैन्युअल रूप से लोड करने की आवश्यकता क्यों है? –

+0

क्योंकि उन संसाधन फ़ाइलों को एक असेंबली में संकलित किया गया है और उनमें से कई हैं। उदाहरण के लिए मेरे पास स्किन 1 और स्किन 2 असेंबली हैं, और कॉन्फ़िगर इंगित करता है कि ऐप स्किन 1 का उपयोग करता है, इसलिए ऐप को स्वचालित रूप से दोनों को लोड नहीं करना चाहिए। हालांकि ऐप को स्किन 2 के अस्तित्व के बारे में पता होना चाहिए ताकि उपयोगकर्ता इसे चुन सके। –

+0

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

उत्तर

3

संपादित करें: मैंने कुछ और विस्तृत जानकारी के साथ उत्तर अपडेट किया है।

यहां एक उदाहरण है कि आप जो करना चाहते हैं उसे पूरा कर सकते हैं।
अपने विभिन्न प्रकार के प्लगइन प्रकारों के लिए एक enum परिभाषित करके प्रारंभ करें।

public enum AssemblyPluginType 
{ 
    Skins, 
    Browser 
} 

प्लगइन (असेंबली प्लगइन प्रकार और संभावित संघर्ष) का वर्णन करने के लिए उपयोग किए जाने वाले दो विशेषताओं को जोड़ें।

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)] 
public sealed class AssemblyPluginAttribute : Attribute 
{ 
    private readonly AssemblyPluginType _type; 

    public AssemblyPluginType PluginType 
    { 
     get { return _type; } 
    } 

    public AssemblyPluginAttribute(AssemblyPluginType type) 
    { 
     _type = type; 
    } 
} 

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)] 
public sealed class AssemblyPluginConflictAttribute : Attribute 
{ 
    private readonly AssemblyPluginType[] _conflicts; 

    public AssemblyPluginType[] Conflicts 
    { 
     get { return _conflicts; } 
    } 

    public AssemblyPluginConflictAttribute(params AssemblyPluginType[] conflicts) 
    { 
     _conflicts = conflicts; 
    } 
} 

अब आप इन विशेषताओं को अपनी असेंबली में जोड़ सकते हैं।

असेंबली में जब भी वे नामस्थान के बाहर हैं, तो निम्नलिखित दो पंक्तियों को कहीं भी जोड़ा जा सकता है। मैं आमतौर पर AssemblyInfo.cs फ़ाइल में असेंबली विशेषताएँ डालता हूं जो Properties फ़ोल्डर में पाया जा सकता है।

[assembly: AssemblyPluginAttribute(AssemblyPluginType.Browser)] 
[assembly: AssemblyPluginConflictAttribute(AssemblyPluginType.Skins, AssemblyPluginType.Browser)] 

अब आप विशिष्ट विशेषताओं के लिए एक विधानसभा की जांच के लिए निम्नलिखित कोड का उपयोग कर सकते हैं:

using System; 
using System.Reflection; 

namespace ConsoleApplication 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      // Get the assembly we're going to check for attributes. 
      // You will want to load the assemblies you want to check at runtime. 
      Assembly assembly = typeof(Program).Assembly; 

      // Get all assembly plugin attributes that the assembly contains. 
      object[] attributes = assembly.GetCustomAttributes(typeof(AssemblyPluginAttribute), false); 
      if (attributes.Length == 1) 
      { 
       // Cast the attribute and get the assembly plugin type from it. 
       var attribute = attributes[0] as AssemblyPluginAttribute; 
       AssemblyPluginType pluginType = attribute.PluginType; 
      } 
     } 
    } 
} 
+0

धन्यवाद, क्या आप कृपया यह निर्दिष्ट कर सकते हैं कि मुझे उन '[असेंबली: ...]' विशेषताओं को कहां रखा जाना चाहिए, और मैं उन विशेषताओं के लिए असेंबली से कैसे पूछ सकता हूं? –

+0

@ बोरीस: मैंने असेंबली विशेषताओं की घोषणा करने के लिए और असेंबली से जानकारी पूछने के तरीके के बारे में कुछ और जानकारी के साथ उत्तर अपडेट किया है। – Patrik

2

मैं आंशिक रूप से जानकारी लेकिन

आप Custom AssemblyInfo Attributes जो आप लिंक पर जाकर देख सकते हैं ..

+1

धन्यवाद, यह वही हो सकता है जो मैं ढूंढ रहा हूं, इसे आजमाएं। –

0

जोड़ सकते हैं प्लगइन्स के लिए हो रही है, मैं MvcTurbine के साथ महान अनुभव है (यह अन्य परियोजनाओं, नहीं के साथ इस्तेमाल किया जा सकता केवल एमवीसी)। आप Ninject के साथ संयोजन में इसका इस्तेमाल करते हैं और प्लगइन के लिए इंटरफेस को परिभाषित, अर्थात् हैं:

IPlugin{ 
    string Name {get;} 
    someResultType PerformAction(someArgType arg); 

} 

और, अपने प्लगइन dll में आप MvcTurbine से IServiceRegistrator इंटरफेस को लागू करने, तब तक IPlugin के कार्यान्वयन रजिस्टर यदि आप प्लगइन बिन में साथ dll जगह निर्देशिका, आपके प्लगइन कार्यान्वयन को उस सूची में जोड़ा जाएगा जो डीआई का उपयोग करने वाले कुछ वर्ग के निर्माता में पारित किया जाता है और सूची प्राप्त करता है, या आप इसे आईओसी कंटेनर से हाथ से हल कर सकते हैं। यह आपके असेंबली को हाथ से लोड करने और इंटरफेस/कार्यान्वयन आदि के लिए निरीक्षण करने से बहुत साफ है ...

यदि आप इसमें रूचि रखते हैं, तो कृपया पूछें कि कुछ अस्पष्ट है और मैं विस्तृत करूंगा।

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