web-dev-qa-db-fra.com

Impossible de charger une ressource de manifeste avec GetManifestResourceStream ()

J'ai créé une section de configuration personnalisée à l'aide de XSD. Afin d'analyser le fichier de configuration qui suit ce nouveau schéma, je charge la ressource (mon fichier .xsd) avec ceci:

public partial class MonitoringConfiguration
    {
        public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd";
        public const string ConfigSchema = "urn:MonitoringConfiguration-1.0";

        private static XmlSchemaSet xmlSchemaSet;

        static MonitoringConfiguration()
        {
            xmlSchemaSet = new XmlSchemaSet();
            Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
            XmlReader schemaReader = XmlReader.Create(xsdStream);
            xmlSchemaSet.Add(ConfigSchema, schemaReader);
        }

    }

Au fait, ma ressource est: MonitoringConfiguration.xsd. Et l’espace de noms de l’autre classe partielle (qui représente le code derrière le fichier .xsd) est MonitoringAPI.Configuration.

Le problème se situe ici:

 Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);

Le xsdStream est null, donc je suppose que la ressource est introuvable! Mais pourquoi?

Je vous remercie

44
Amokrane Chentir

Le nom de la ressource est toujours:

<Base namespace>.<RelativePathInProject>.<FileName>

Par conséquent, si votre ressource est située dans "Resources/Xsd /" et que votre espace de nom de projet par défaut est "MonitoringAPI.Configuration", le nom de la ressource est:

"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"

Assurez-vous également que l'action de génération de votre ressource est définie sur "Ressource incorporée".

89
Philippe Leybaert

Manière simple et correcte d’obtenir le nom réel de votre ressource incorporée:

string[] resourceNames =
    Assembly.GetExecutingAssembly().GetManifestResourceNames();

Ensuite, vérifiez simplement le tableau resourceNames et vous saurez exactement quoi transmettre à la méthode GetManifestResourceStream.

48
user1958681

Dans mon cas, 

Lorsque vous essayez d'accéder au fichier via GetManifestResourceStream(). Vous obtiendrez une erreur due à un chemin non valide du fichier et le flux sera nul.

Solution:

Faites un clic droit sur le fichier que vous avez ajouté à la solution et cliquez sur Propriétés. 

Sélectionnez le Build Action comme Embedded Resource. (Au lieu de Content - par défaut)

 Build action property set to embedded resource

11
RajeshKdev

Par défaut, visual studio n'incorpore pas le fichier xsd. Par conséquent, vous devez vous assurer que la propriété "Action de compilation" du fichier xsd est définie sur "Ressource intégrée" pour que cela fonctionne.

8
Huy Thai

ajoutez simplement vos ressources sous form1.resx -> ajoutez des éléments existants

double-cliquez sur les ressources que vous avez ajoutées sous Ressources folder.go dans les propriétés et sélectionnez "Ressources incorporées" au lieu de aucune.

Ensuite, essayez de déboguer la ligne:

string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();

vérifiez que les ressources que vous avez ajoutées se trouvent dans le tableau. puis copiez le nom de la ressource exactement à partir de ce tableau et essayez de mettre le nom sur votre code..il fonctionne bien !!

5
Rittika

Vous pouvez obtenir le flux de ressources en passant les noms de ressources, comme suit ci-dessous ...

  1. Obtenez le nom de la ressource, par exemple ..

    Assembly objAssembly = Assembly.GetExecutingAssembly ();

    string [] strResourceNames = objAssembly.GetManifestResourceNames ();

  2. Transmettez les noms de ressources à ...

    Stream strm = objAssembly.GetManifestResourceStream (strResourceNames);

Maintenant que vous avez Stream, vous pouvez faire ce que vous voulez ...

1
Sanjay Dwivedi

J'ai eu un problème où je intégrais tout un tas de fichiers .xsd dans de nombreux assemblys différents; tout fonctionnait (GetManifestResourceNames renvoyait les fichiers que je m'attendais à voir) à l'exception d'un seul. Celui qui ne s'appelait pas s'appelait:

Something.LA.xsd

Je n'avais pas affaire à des cultures spécifiques et le bit .LA situé à la fin du nom de fichier était capturé par le compilateur, ce fichier étant destiné à la culture LA. LA) - par conséquent, je ne parviens pas à le trouver (il s'est retrouvé dans une assemblée satellite). J'ai esquivé le problème en renommant le fichier - il est vraisemblablement possible d'indiquer explicitement la culture d'une ressource incorporée donnée.

En fait, un rapide Google révèle: Comment puis-je empêcher la culture de fichiers de ressources incorporée d'être définie en fonction de son nom de fichier

Selon cette réponse, vous devez faire des choses hacky - alors peut-être que renommer le fichier n'était pas si mal après tout :)

0
GHC

Dans mon cas, c'était quelque chose de complètement différent:

Mon application UWP a été compilée correctement dans la configuration Debug and Release, mais GetManifestResourceStream a renvoyé la configuration Null only Release. 

Le problème était que, dans le fichier de configuration de construction UWP (et uniquement là), le paramètre "Compiler avec la chaîne d'outils .NET Native" était activé. Après la désactivation, GetManifestResourceStream a fonctionné comme prévu. 

0
Marcus