2010-09-04 7 views
2

Comment puis-je obtenir dynamiquement toutes les ressources de mon assemblage actuel? J'ai essayé deux méthodes, GetManifestResourceNames et GetResourceSet sans succès. Je suis à l'aise avec des solutions dans VB.net ou C#..NET: Obtenir des ressources par réflexion

Première méthode

Cette première méthode ne retourne un tableau de longueur 1, avec cette valeur « MyNameSpace.Resources.resource ». Le problème est qu'il y a plus d'une ressource dans ce fichier.

Dim ca As Assembly = Assembly.GetExecutingAssembly 
Dim rn() As String = CurrentAssembly.GetManifestResourceNames() 

Deuxième méthode

Dim ca As Assembly = Assembly.GetExecutingAssembly 
Dim crm As New ResourceManager("", ca) 
''//Dim CurrentResourceManager As New ResourceManager(_ 
     "MyNamespace.Resources.resources", CurrentAssembly) 
''//Dim CurrentResourceManager As New ResourceManager(_ 
     "My.Resources", CurrentAssembly) 
Dim rs As ResourceSet = CurrentResourceManager.GetResourceSet(CultureInfo.CurrentCulture, True, True) 
Dim rs As ResourceSet = crm.GetResourceSet(_ 
       CultureInfo.CurrentCulture, True, True) 

MissingManifestResourceException était non gérée

Impossible de trouver des ressources appropriées pour la culture spécifiée ou la culture neutre. Assurez-vous que ".resources" a été correctement intégré ou lié dans l'assembly "MyProgram" au moment de la compilation, ou que tous les assemblys satellites requis sont chargeables et entièrement signés.

Solution (selon Hans Passant)

Copiez le Namespace du Resources.Designer.vb

<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _ 
     Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager 
      Get 
       If Object.ReferenceEquals(resourceMan, Nothing) Then 
        Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("MyNamespace.Resources", GetType(Resources).Assembly) 
        resourceMan = temp 
       End If 
       Return resourceMan 
      End Get 
     End Property 

et placez-le dans le code

Dim CurrentResourceManager As New ResourceManager(_ 
     "MyNamespace.Resources", CurrentAssembly) 
Dim rs As ResourceSet = CurrentResourceManager.GetResourceSet(_ 
     CultureInfo.CurrentCulture, True, True) 

Répondre

3

Oui , il y a plus d'une ressource dans MyNameSpace.Resources.resource. Quel est le nom que vous devez transmettre à ResourceManager, une chaîne vide ne fonctionnera pas.

Pour voir le type de code que vous devez écrire, démarrez une application Windows Forms et ajoutez quelques ressources à l'onglet Project + Properties, Resources. Dans l'Explorateur de solutions, cliquez sur l'icône "Afficher tous les fichiers". Ouvrez le nœud Mon projet, ouvrez le nœud Resources.resx et double-cliquez sur le fichier Resources.Designer.vb. Notez le code pour la propriété ResourceManager.

+0

+1 sur l'indice de recherche d'un exemple de code. Parfois, je ne réalise même pas qu'il existe, et je le trouve toujours extrêmement utile. –

+0

Question: Comment se fait-il quand je compile avec "vbc/t: exe myfile.vb/res: myresouce1/res: myresource2" Je peux obtenir toutes mes ressources avec GetManifestResourceNames mais quand j'utilise l'IDE ils sont tous cachés? –

+0

Annuler cela ... Resgen va générer un fichier resx. –

Questions connexes