2011-03-16 4 views
1

J'ai un fichier XML inclus dans mon projet Silverlight 4.0 auquel j'aimerais accéder au moment de l'exécution. J'ai le fichier enregistré dans un répertoire nommé Resources avec l'action Build définie sur "Content" et le répertoire Copy to Output sur "Do not copy". Si je décompresse le fichier XAP, je vois le fichier XML à l'emplacement auquel je m'attends, mais je ne suis pas sûr de savoir comment le référencer à partir du code. J'ai actuellement ce qui suit:Accès aux ressources au moment de l'exécution

Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(@"/AssemblyName;component/Resources/MyFile.xml")

Malheureusement, flux est nul après l'exécution du code ci-dessus. En plus du chemin mentionné ci-dessus, j'ai essayé "/Resources/MyFile.xml", "/MyFile.xml" et "MyFile.xml", mais ils ont tous le même comportement.

Quelle est la manière correcte d'accéder à un fichier XML incorporé en tant que ressource dans une application Silverlight?

Répondre

2

Une ressource à l'action de construction « Contenu » juste s'intégré dans le fichier XAP, avec la même structure de répertoire relatif comme l'application. Il n'est pas incorporé en tant que ressource dans l'assemblage.

Réglé pour construire une action « contenu », vous devriez être en mesure de charger tout le fichier en utilisant quelque chose comme (ou tout ce qui convient à vos besoins):

XElement.Load(<relative directory>/<file>)

La méthode que vous utilisez actuellement (en utilisant un flux de ressources) est pour les ressources intégrées (dont l'action de construction est définie sur "Ressource"). Et pour ceux, bien que je ne l'ai pas encore essayé si votre méthode fonctionne, habituellement, vous obtiendrez les ressources en utilisant

Application.GetResourceStream 
+0

J'ai effectivement essayé de définir l'action de construction sur "Resource", mais la même chose s'est produite (stream est nul après l'exécution). XElement.Load() renvoie l'exception suivante: Impossible de trouver le fichier '/Resources/MyFile.xml' dans le package xap d'application. – senfo

+1

@senfo: supprime la première barre oblique (c'est-à-dire "Resources/MyFile.xml"), et cela devrait fonctionner (en supposant que "MyFile.xml" se trouve dans un sous-répertoire "Resources" du projet silverlight). –

+0

c'était tout! Merci beaucoup! – senfo

1

J'ai utilisé le code ci-dessous pour avoir accès aux drawables. Je ne sais pas qu'il est tout à fait pertinent, mais en espérant que cela vous donnera une indication d'une façon ou d'une autre ...

Resources res = getResources(); 
spec = tabHost.newTabSpec("groups").setIndicator("Groups", res.getDrawable(R.drawable.ic_tab_groups)).setContent(intent); 
1

Comme il a été mentionné par Willem van Rumpt, les ressources « de contenu » ne sont pas des ressources habituelles (ils Aren n'est pas stocké dans l'assemblage). J'ai vérifié this article et n'a pas pu trouver du tout que vous pourriez référencer la ressource, marquée comme "contenu" de l'autre assemblée.

Donc, vous avez deux options:

  1. Définir XML en tant que ressource incorporée
  2. Définir XML comme ressource

Dans la première demande de flux de cas ressemble:

 var a = Assembly.Load("AssemblyName"); 
     var s = a.GetManifestResourceStream(@"DefaultNamespace.Resources.XMLFile2.xml"); 

Dans le deuxième cas:

 var a = Assembly.Load("AssemblyName"); 
     var rm = new ResourceManager("AssemblyName.g", a); 
     using (var set = rm.GetResourceSet(CultureInfo.CurrentCulture, true, true)) 
     { 
      var ums = (UnmanagedMemoryStream)set.GetObject(@"Resources/XMLFile1.xml", true); 
     } 

Espérons que cela aide.

Questions connexes