2010-06-18 6 views
39

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

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

    } 

D'ailleurs 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 nul, donc je suppose que la ressource ne peut pas être trouvé! Mais pourquoi?

Merci

Répondre

75

Le nom de la ressource est toujours:

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

Donc, si votre ressource est située dans "Ressources/Xsd /", et votre espace de noms de projet par défaut est « MonitoringAPI. configuration », le nom de la ressource:

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

assurez-vous également que la construction d'un ction pour votre ressource est réglée sur « intégrée des ressources »

+0

:) Ma ressource est situé dans le même répertoire que cette classe. –

+1

Cliquez avec le bouton droit sur le fichier et choisissez "Propriétés". –

+0

Merci c'était le problème!J'ai passé une demi-journée à trouver le problème et vous l'avez résolu en une minute;) –

8

Par défaut, Visual Studio n'intègre pas le fichier xsd donc vous devez vous assurer la propriété « Build action » du fichier xsd est réglé sur « intégrée des ressources » pour le rendre fonctionne

48

simple et bonne façon d'obtenir le nom réel de votre ressource incorporée:

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

Ensuite, il suffit de vérifier tableau ResourceNames, et vous saurez à coup sûr que de passer à la méthode GetManifestResourceStream.

+2

Pour user1958681 ... OUI !!! Dans mon cas, les chemins de ressource étaient "non standard", en ce sens qu'ils n'avaient pas le sous-répertoire de ressources dans leurs noms. Le tour de tableau était parfait pour connaître le bon nom. Merci beaucoup!! –

+0

Le mien n'avait pas le sous-répertoire dans leurs noms non plus. Quelqu'un sait-il pourquoi? –

+1

J'ai trouvé juste en cours d'exécution 'Assembly.GetExecutingAssembly(). GetManifestResourceNames();' dans la fenêtre intermédiaire alors que le débogage était suffisant. Donne une belle sortie formatée facile à lire. – Lankymart

8

Dans mon cas,

Lorsque vous essayez d'accéder au fichier via GetManifestResourceStream(). Vous obtiendrez une erreur en raison d'un chemin invalide du fichier, et le flux sera nul.

Solution:

Faites un clic droit sur le fichier que vous avez ajouté pour solution et cliquez sur Propriétés. Sélectionnez le Build Action en tant que Embedded Resource. (Au lieu de Content - par défaut)

Build action property set to embedded resource

4

simplement ajouter vos ressources en Form1.resX -> ajouter des éléments existants

cliquez deux fois sur les ressources dont vous avez ajoutées sous la rubrique Ressources folder.go aux propriétés et sélectionnez "Embedded Resources" au lieu de none.

Ensuite essayer la ligne de débogage:

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

contrôle les ressources dont vous avez ajoutés sont dans le tableau. puis copiez le nom de la ressource exactement à partir de ce tableau et essayez de mettre le nom sur votre code .. ça marche bien !!

1

Vous pouvez obtenir le flux de ressources en passant les noms des ressources qui se présente comme suit ci-dessous ...

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

    Assemblée objAssembly = Assembly.GetExecutingAssembly()

    chaîne [] strResourceNames = objAssembly.GetManifestResourceNames();

  2. passer les noms de ressources pour ...

    flux STRM = objAssembly.GetManifestResourceStream (strResourceNames);

Maintenant vous avez flux que vous pouvez faire ce que vous voulez ...

0

Dans mon cas, il était complètement différent:

Mon UWP App compilé correctement et de débogage Libération de la configuration, mais GetManifestResourceStream n'a renvoyé que la configuration Release.

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

0

J'ai rencontré un problème lors de l'intégration d'un tas entier de fichiers .xsd dans de nombreux assemblages différents; tout fonctionnait (GetManifestResourceNames renvoyait les fichiers que je m'attendais à voir) sauf un. Celui qui n'a pas été a été appelé:

Something.LA.xsd 

je ne traite pas avec des cultures spécifiques et le bit .LA à la fin du nom de fichier est être repris par le compilateur que ce fichier étant pour la culture LA - le nom de fichier dans le manifeste se trouvait sous Something.xsd (sous culture LA) - donc je ne pouvais pas le trouver (il s'est retrouvé dans une assemblée satellite). J'ai esquivé le problème en renommant le fichier - probablement, il est possible d'indiquer explicitement la culture d'une ressource incorporée donnée.

En fait, un rapide Google révèle: How can I prevent embedded resource file culture being set based on its filename

Selon cette réponse, vous avez à faire des choses aki - alors peut-être renommer le fichier n'a pas été si mal après tout

Questions connexes