Pergunta

Estou armazenando um PNG como um recurso incorporado em uma montagem.Dentro do mesmo assembly eu tenho um código como este:

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

O arquivo denominado "file.png" é armazenado na pasta "Recursos" (dentro do Visual Studio) e é marcado como um recurso incorporado.

O código falha com uma exceção dizendo:

O recurso MyNamespace.Resources.file.png não pode ser encontrado na classe MyNamespace.MyClass

Tenho código idêntico (em um assembly diferente, carregando um recurso diferente) que funciona.Então eu sei que a técnica é boa.Meu problema é que acabo gastando muito tempo tentando descobrir qual é o caminho correto.Se eu pudesse simplesmente consultar (por exemplo.no depurador) o assembly para encontrar o caminho correto, isso me pouparia um monte de dores de cabeça.

Foi útil?

Solução

Isso lhe dará uma matriz de strings de todos os recursos:

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

Outras dicas

Eu também me esqueço de como fazer isso todas as vezes, então apenas reúno as duas frases que preciso em uma pequena aula:

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

Suponho que sua classe esteja em um namespace diferente.A maneira canônica de resolver isso seria usar a classe de recursos e um recurso fortemente tipado:

ProjectNamespace.Properties.Resources.file

Use o gerenciador de recursos do IDE para adicionar recursos.

Eu uso o seguinte método para obter recursos incorporados:

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

Eu então chamo isso com o caminho no projeto:

GetResourceStream(@"DirectoryPathInLibrary/Filename")

O nome do recurso é o espaço de nomes mais o espaço de nomes "pseudo" do caminho para o arquivo.O espaço de nome "pseudo" é feito pela estrutura de subpastas usando \ (barras invertidas) em vez de .(pontos).

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

A seguinte chamada:

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

retornará o fluxo de my.xml localizado na estrutura de pastas resources\xml no namespace:meu.namespace.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top