আমি এম্বেড থাকা সংস্থার "পথ" কীভাবে আবিষ্কার করব?


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

সংস্থান যুক্ত করতে আইডিই এর রিসোর্স ম্যানেজার ব্যবহার করুন।


আপনারা ঠিক বলেছেন, আমার ক্লাসটি আলাদা একটি নেমস্পেসে। দেখে মনে হচ্ছে রিসোর্স ফোল্ডারটি প্রকল্প কনফিগারেশনে ডিফল্ট নেমস্পেস হিসাবে উল্লিখিত নেমস্পেসের অধীনে বাস করে, বিভিন্ন কারণে এই শ্রেণীর যে অংশটি অন্তর্ভুক্ত থাকে সেই নামস্থানটি নয়। আমি সন্দেহ করি যে আপনি সম্পূর্ণ ভিন্ন পদ্ধতির সম্পূর্ণ ব্যবহার করার বিষয়েও সঠিক, তবে আমার যেমন উত্তরাধিকারের কোডের সাথে সামঞ্জস্য হওয়া দরকার এটি আমার নিয়ন্ত্রণের বাইরে।
রব

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

সংস্থানটির নাম হ'ল নাম স্থান প্লাস "সিউডো" নামের ফাইলটির রাস্তার স্থান name "সিউডো" নামের স্থানটি সাব ফোল্ডার কাঠামোর পরিবর্তে \ (ব্যাকস্ল্যাশ) ব্যবহার করে তৈরি করা হয়েছে। (বিন্দু)।

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")

ফোল্ডার-কাঠামো সংস্থানগুলিতে অবস্থিত my.xML এর প্রবাহটি \ xML নাম জায়গাতে ফিরিয়ে দেবে: my.namespace।


6
ফোল্ডারে ড্যাশগুলি ('-') আন্ডারস্কোর ('_') দ্বারা প্রতিস্থাপন করা হয়। এছাড়াও অন্যান্য চিহ্ন থাকতে পারে। আমি দেখতে চাই যে সংকলকটি এটি কীভাবে করছে তা আমরা একই পদ্ধতিটি ব্যবহার করতে পারি।
বয়কো কারাদঝভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.