Vra

Ek stoor 'n PNG as 'n geïntegreerde hulpbron in 'n vergadering. Van binne dieselfde gemeente Ek het 'n paar kode soos volg:

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

Die lêer met die naam "file.png" gestoor in die gids "Resources" (binne Visual Studio), en is gemerk as 'n geïntegreerde hulpbron.

Die kode versuim met 'n uitsondering gesegde:

  

Resource MyNamespace.Resources.file.png kan nie gevind word nie in die klas MyNamespace.MyClass

Ek het dieselfde kode (in 'n ander gemeente, laai 'n ander bron) wat werk. So ek weet die tegniek is klank. My probleem is ek uiteindelik spandeer baie tyd probeer om uit te vind wat die regte pad is. As ek kon net navraag (bv. In die debugger) die vergadering af weg na die regte pad te vind, sou dit my red 'n las van hoofpyn.

Was dit nuttig?

Oplossing

Dit sal jy 'n string verskeidenheid van al die hulpbronne:

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

Ander wenke

Ek vind myself te vergeet hoe om dit te doen elke keer as goed so ek het net die twee one-liners wat ek nodig het in 'n bietjie klas toe te draai:

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

Ek vermoed dat jou klas is in 'n ander naamruimte. Die kanonieke manier om dit op te los sou wees om die klas hulpbronne en 'n sterk getik hulpbron gebruik:

ProjectNamespace.Properties.Resources.file

Gebruik die IDE se hulpbron bestuurder om hulpbronne toe te voeg.

Ek gebruik die volgende metode om ingebed hulpbronne gryp:

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

Ek dan noem dit met die pad in die projek:

GetResourceStream(@"DirectoryPathInLibrary/Filename")

Die naam van die hulpbron is die naam ruimte plus die "pseudo" naam ruimte van die pad na die lêer. Die "pseudo" naam ruimte gemaak deur die sub lêergidsstruktuur met behulp van \ (skuinsstrepe) in plaas van. (Dots).

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

Die volgende oproep:

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

sal die stroom van my.xml geleë in die gids-struktuur hulpbronne \ xml in die naam ruimte terugkeer:. My.namespace

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top