2009-10-17 16 views
6

में उपयोग की गई असेंबली के पथ प्राप्त करें मुझे एक ऐसी विधि चाहिए जो टाइप लेती है और प्रकार में उपयोग की जाने वाली सभी असेंबली के पथ लौटाती है।टाइप

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) 
{ 
yield return type.Assembly.Location; 

foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies()) 
{ 
    yield return Assembly.Load(assemblyName).Location; 
} 
} 

आम तौर पर इस विधि काम करते हैं, लेकिन हो कुछ नुकसान: मैं यह लिखा तो

  • मैं नहीं मिला था संदर्भित विधानसभाओं पाने के लिए/प्रकार से ही प्रकार, मैंने टाइप किया। Assembly.GetReferencedAssemblies() और पूरे असेंबली के संदर्भ प्राप्त हुए, न कि केवल इस प्रकार से संबंधित।

  • type.Assembly.GetReferencedAssemblies() असेंबलीनाम लौटाता है और इसमें कोई स्थान/पथ/फ़ाइलपैथ संपत्ति नहीं है। स्थान संपत्ति प्राप्त करने के लिए, मैंने पहले असेंबली.लोड() का उपयोग किया और फिर स्थान संपत्ति का उपयोग किया। मैं अपने पथ को पाने के लिए असेंबली लोड नहीं करना चाहता, क्योंकि वे आवश्यक नहीं हैं, और क्योंकि विधानसभा.लोड() FileNotFoundException या BadImageFormatException के साथ विफल हो सकती है।

उत्तर

9

मुझे लगता है कि मैंने असेंबली को हल किया। लोड() समस्या इसे विधानसभा में बदलकर। रिफ्लेक्शनऑनलीलोड()।

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) 
{   
    yield return type.Assembly.Location; 

    foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies()) 
    { 
     yield return Assembly.ReflectionOnlyLoad(assemblyName.FullName).Location; 
    } 
} 

अब केवल बाईं समस्या type.Assembly.GetReferencedAssemblies() है, मैं कैसे प्रकार से करने के बजाय विधानसभा से संदर्भित विधानसभाओं मिलता है:

अब यह कैसे मेरी विधि की तरह लग रहा है?

+0

सभी प्रकार असेंबली से संबंधित हैं - आपको बस टाइप करने में सक्षम होना चाहिए। Assembly.GetReferencedAssemblies()। ओह रुको, आप पहले से ही कर रहे हैं। मुझे लगता है कि यह लंबे समय तक हल हो गया है, है ना? 2011? –

+0

@DxCK उस समस्या के बारे में कोई समाधान? मेरा मुद्दा: मेरी लाइब्रेरी प्रोजेक्ट संदर्भ Oracle.DataAccess 4.112.2.0, लेकिन निष्पादन समय में, GAC Oracle.DataAccess 4.121.1.0 से लोड करता है। असेंबली। गेट रेफरेंस एस्सेम्ब्लीज़() मुझे ओरेकल दें। डेटाएप 4.112.2.0 ओरेकल नहीं। डेटाएप 4.121.1.0। – Kiquenet

+0

उपयोग करने के लिए, 'var results = this.GetType() पर जाएं। GetReferencesAssembliesPaths(); '। – Contango

2

type.Assembly.GetReferencedAssemblies() सभी विधानसभाओं कि विधानसभा में जो प्रकार घोषित किया जाता है द्वारा संदर्भित कर रहे हैं वापस आ जाएगी। इसका मतलब यह नहीं है कि इस समारोह के साथ आपको जो असेंबली मिलती है, उसके पास दिए गए प्रकार के साथ कुछ भी समान होता है।

+0

हाँ, यह उस विधि के साथ मेरी समस्याओं में से एक है। – DxCK

+0

इसके बारे में समस्या: एक लाइब्रेरी प्रोजेक्ट संदर्भ Oracle.DataAccess 4.112.2.0, लेकिन निष्पादन समय में, GAC Oracle.DataAccess 4.121.1.0 से लोड करता है। असेंबली। गेट रेफरेंस एस्सेम्ब्लीज़() मुझे ओरेकल दें। डेटाएप 4.112.2.0 ओरेकल नहीं। डेटाएप 4.121.1.0। – Kiquenet

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