كيف يمكنني اكتشاف "المسار" جزءا لا يتجزأ من الموارد ؟

StackOverflow https://stackoverflow.com/questions/27757

  •  09-06-2019
  •  | 
  •  

سؤال

انا تخزين PNG باعتبارها جزءا لا يتجزأ من الموارد في الجمعية.من داخل نفس الجمعية لدي بعض رمز مثل هذا:

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

الملف اسمه "الملف.png" يتم تخزينها في "الموارد" المجلد (داخل Visual Studio) و هو وضع علامة عليها باعتبارها جزءا لا يتجزأ من الموارد.

فشل التعليمات البرمجية مع استثناء قائلا:

الموارد MyNamespace.الموارد.الملف.png يمكن العثور عليها في فئة MyNamespace.MyClass

لدي متطابقة رمز (في مختلف الجمعية, تحميل الموارد المختلفة) الذي يعمل.إذا كنت لا تعرف تقنية الصوت.مشكلتي هي أنني في نهاية المطاف أنفاق الكثير من الوقت في محاولة معرفة ما يصحح المسار.إذا أنا يمكن ببساطة الاستعلام (على سبيل المثال.في المصحح) الجمعية إلى العثور على المسار الصحيح, الذي من شأنه أن ينقذ لي شحنة من الصداع.

هل كانت مفيدة؟

المحلول

هذا سوف تحصل على سلسلة مجموعة من الموارد:

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

نصائح أخرى

أجد نفسي نسيت كيف تفعل هذا في كل مرة وكذلك لذلك أنا مجرد التفاف اثنين واحد المتشددين أحتاج قليلا في الدرجة:

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();
    }
}

أظن أن فئة مختلفة في مساحة الاسم.الكنسي طريقة لحل هذا من شأنه أن يكون استخدام الموارد في الدرجة بقوة كتبته الموارد:

ProjectNamespace.Properties.Resources.file

استخدام IDE مدير الموارد لإضافة الموارد.

أنا استخدم الأسلوب التالي إلى الاستيلاء على الموارد المضمنة:

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

اسم المورد هو اسم الفضاء بالإضافة إلى "الزائفة" اسم مساحة المسار إلى الملف."الزائفة" اسم الفضائية من دون بنية المجلد باستخدام \ (الخطوط المائلة العكسية) بدلا من .(النقاط).

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 في مساحة اسم:بلدي.مساحة الاسم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top