web-dev-qa-db-fra.com

Pourquoi GetManifestResourceStream renvoie-t-il null alors que le nom de la ressource existe lors de l'appel de GetManifestResourceNames?

J'ai un projet d'application web. J'ai généré la DLL et l'importe dans un autre projet. J'ai implémenté VirtualPathProvider

J'ai suivi ce site Web: http://support.Microsoft.com/kb/910441/en-us?spid=8940&sid=global et tout fonctionne jusqu'à ce que j'ajoute un autre maître de site.

  1. J'ai ajouté site_export.master et modifié son action de génération en ressource intégrée.
  2. J'ai changé ma page pour utiliser le nouveau maître de site.
  3. GetManifestResourceStream() renvoie null lorsque je charge site_export.master.
  4. J'appelle GetManifestResourceNames() pour vérifier si site_export.master existe dans DLL et c'est le cas. C'est dans la liste. Tous les espaces de noms correspondent. Je n'ai pas énuméré l'espace de nom ici.

Pourquoi GetManifestResourceStream() ne peut-il pas charger mon nouveau site_export.master? Il charge site.master très bien. Je sais que ma DLL est chargée car je peux voir d'autres fichiers dans la DLL.

41
MsBugKiller

Rappelez-vous les problèmes suivants ...

Étape 1. Construire un jeu d’actions sur une ressource incorporée voir

GetManifestResourceStream Gotcha de C #

Étape 2. Utilisez namespace.resourcename voir GetManifestResourceStream () renvoie null?

En fait, cette méthode renvoie la valeur null si une ressource privée d'un autre assembly est utilisée et si l'appelant n'a pas ReflectionPermission avec l'indicateur ReflectionPermissionFlag.MemberAccess.

81
Shahdat

Soupçon de côté. Pour vous assurer que vous êtes dans la bonne assemblée et avec le bon nom: exportez et évaluez toutes les ressources disponibles dans votre assemblée cible

string[] names = Assembly.GetManifestResourceNames();

(dans mon cas, j'ai mal utilisé un espace de noms d'une autre assemblée)

61
Yury Schkatula

J'ai fait ça pour que ça marche:

Étape 1: Sélectionnez la ressource (CRDF.xsl dans mon cas) et cliquez avec le bouton droit de la souris sur> Propriétés . Définissez l’action de construction sur "EmbeddedResource" et le nom logique sur le nom de votre choix, par exemple. CRDFXSL. 

Étape 2: / Modifiez votre code source comme suit:

Assembly _Assembly;
  _Assembly = Assembly.GetExecutingAssembly();         
  xslStream = _Assembly.GetManifestResourceStream("CRDFXSL");
  _xmlReader = XmlReader.Create(xslStream);

Ainsi tout est allé smoooooooth ..

7
Deepak Chaudhary

Astuce et précaution: Si le "nom de l'assembly" et "l'espace de nom par défaut" ne correspondent pas dans le fichier projet, alors GetManifestResourceStream renvoie null GetManifestResourceNames renvoie toujours les noms des assemblys mais pendant le chargement, le manifeste ne fonctionnerait pas.

2
RajivS

Essaye ça:

Dim ctx As Windows.ApplicationModel.Resources.Core.ResourceContext = New Windows.ApplicationModel.Resources.Core.ResourceContext()
ctx.Languages = {Globalization.CultureInfo.CurrentUICulture.Name}
Dim rmap As Windows.ApplicationModel.Resources.Core.ResourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap
Dim res = rmap.GetValue("Assets/sample.png", ctx)
Dim resFile = Await res.GetValueAsFileAsync

Le Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap liste toutes les ressources.

0
Rodrigo T.