मैं एक एम्बेडेड संसाधन के "पथ" की खोज कैसे कर सकता हूं?


110

मैं एक विधानसभा में एक एम्बेडेड संसाधन के रूप में एक पीएनजी स्टोर कर रहा हूं। उसी विधानसभा के भीतर से मेरे पास कुछ इस तरह का कोड है:

Bitmap image = new Bitmap(typeof(MyClass), "Resources.file.png");

"File.png" नाम की फ़ाइल "संसाधन" फ़ोल्डर (विज़ुअल स्टूडियो के भीतर) में संग्रहीत है, और एक एम्बेडेड संसाधन के रूप में चिह्नित है।

कोड अपवाद के साथ विफल रहता है:

संसाधन MyNamespace.Resources.file.png वर्ग MyNamespace.MyClass में नहीं मिल सकता है

मेरे पास समान कोड (एक अलग विधानसभा में, एक अलग संसाधन लोड करना) जो काम करता है। तो मुझे पता है कि तकनीक ध्वनि है। मेरी समस्या यह है कि मैं बहुत समय लगाकर यह पता लगाने की कोशिश कर रहा हूं कि सही रास्ता क्या है। अगर मैं सही रास्ता ढूंढने के लिए असेंबली (डिबगर में) क्वेरी कर सकता था, तो इससे मुझे सिरदर्द का भार बच जाएगा।

जवाबों:


198

यह आपको सभी संसाधनों का एक स्ट्रिंग सरणी मिलेगा:

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();

3
अरे, मैं अपने एम्बेडेड http सर्वर के लिए रूट डार्ट के रूप में असाइन करने के लिए संसाधन फ़ोल्डर पथ कैसे प्राप्त कर सकता हूं?
lazzy_ms

45

मैं खुद को यह भूल जाता हूं कि हर बार यह कैसे करना है, इसलिए मैं सिर्फ एक दो-लाइनर्स को लपेटता हूं, जो मुझे थोड़ी सी कक्षा में चाहिए:

public class Utility
{
    /// <summary>
    /// Takes the full name of a resource and loads it in to a stream.
    /// </summary>
    /// <param name="resourceName">Assuming an embedded resource is a file
    /// called info.png and is located in a folder called Resources, it
    /// will be compiled in to the assembly with this fully qualified
    /// name: Full.Assembly.Name.Resources.info.png. That is the string
    /// that you should pass to this method.</param>
    /// <returns></returns>
    public static Stream GetEmbeddedResourceStream(string resourceName)
    {
        return Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
    }

    /// <summary>
    /// Get the list of all emdedded resources in the assembly.
    /// </summary>
    /// <returns>An array of fully qualified resource names</returns>
    public static string[] GetEmbeddedResourceNames()
    {
        return Assembly.GetExecutingAssembly().GetManifestResourceNames();
    }
}

19

मैं अनुमान लगा रहा हूं कि आपकी कक्षा एक अलग नामस्थान में है। इसे हल करने के लिए विहित तरीका संसाधनों के वर्ग और जोरदार टाइप किए गए संसाधन का उपयोग करना होगा:

ProjectNamespace.Properties.Resources.file

संसाधनों को जोड़ने के लिए IDE के संसाधन प्रबंधक का उपयोग करें।


आप सही हैं, मेरी कक्षा एक अलग नामस्थान में है। ऐसा लगता है कि संसाधन फ़ोल्डर प्रोजेक्ट कॉन्फ़िगरेशन में डिफ़ॉल्ट नाम स्थान के रूप में निर्दिष्ट नामस्थान के नीचे रहता है, जो विभिन्न कारणों से इस वर्ग का नाम स्थान नहीं है। मुझे संदेह है कि आप पूरी तरह से एक अलग दृष्टिकोण का उपयोग करने के बारे में सही हैं, लेकिन जैसा कि मुझे विरासत कोड के अनुरूप होना चाहिए, यह मेरे नियंत्रण से परे है।
22

7
यह संसाधन पकड़ लेता है - यह फ़ाइल पथ नहीं है।
उचिहा इटाची

3
@ उचिहाटची इसीलिए मैंने इस प्रश्न को स्पष्ट रूप से एक और (और यकीनन विहित) तरीके से हल करने की बजाय प्रश्न समस्या का उत्तर देने के बजाय अंतर्निहित समस्या को हल करने का (जो पहले से ही किसी भी दर पर जवाब है)।
कोनराड रूडोल्फ

1
@ उचिहातची यह सवाल उस समस्या को भी बताता है जो पूछने वाले का सामना कर रहा है, उसका दृष्टिकोण क्या है और उसने अब तक कैसे कोशिश की है। हालांकि रूडोल्फ सीधे सवाल का जवाब नहीं देता है, वह समस्या को हल करने के लिए एक और दृष्टिकोण को संबोधित करता है। ज्यादातर मामलों में, यह दृष्टिकोण अधिक सुविधाजनक, सुरक्षित और सामान्य है। यह उत्तर सहायक है। मुझे अभी समझ नहीं आया है कि आपको लोगों के उत्तरों को बंद करने की कोशिश क्यों करनी है। वोट अप / वोट डाउन बटन एक कारण से हैं।
निन

5

मैं एम्बेडेड संसाधनों को हथियाने के लिए निम्न विधि का उपयोग करता हूं:

    protected static Stream GetResourceStream(string resourcePath)
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        List<string> resourceNames = new List<string>(assembly.GetManifestResourceNames());

        resourcePath = resourcePath.Replace(@"/", ".");
        resourcePath = resourceNames.FirstOrDefault(r => r.Contains(resourcePath));

        if (resourcePath == null)
            throw new FileNotFoundException("Resource not found");

        return assembly.GetManifestResourceStream(resourcePath);
    }

मैं तो इस परियोजना में पथ के साथ कहते हैं:

GetResourceStream(@"DirectoryPathInLibrary/Filename")

3

संसाधन का नाम नाम स्थान और फ़ाइल में पथ का "छद्म" नाम स्थान है। "छद्म" नाम स्थान उप फ़ोल्डर संरचना द्वारा (backslashes) के बजाय का उपयोग करके बनाया गया है। (डॉट्स)।

public static Stream GetResourceFileStream(String nameSpace, String filePath)
{
    String pseduoName = filePath.Replace('\\', '.');
    Assembly assembly = Assembly.GetExecutingAssembly();
    return assembly.GetManifestResourceStream(nameSpace + "." + pseduoName);
}

निम्नलिखित कॉल:

GetResourceFileStream("my.namespace", "resources\\xml\\my.xml")

नाम-स्थान में फ़ोल्डर-संरचना संसाधनों \ xml में स्थित my.xml की धारा लौटाएगा: my.namespace।


6
फ़ोल्डर्स में डैश ('-') को अंडरस्कोर ('_') से भी बदला जाता है। अन्य प्रतीक भी हो सकते हैं। मैं यह देखना चाहता हूं कि कंपाइलर यह कैसे कर रहा है इसलिए हम उसी विधि का उपयोग कर सकते हैं।
बॉयको कराधजोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.