Étant donné une instance de System.Reflection.Assembly
.
Réponses
Trop de publicités?Je suis venu dans ce dilemme beaucoup de fois quand je veux charger une ressource à partir de l'actuelle assemblée par son manifeste flux de ressources.
Le fait est que si vous incorporez un fichier en tant que ressource dans votre assemblée à l'aide de Visual Studio son manifeste, le nom de la ressource sera dérivée de l'espace de noms par défaut de l'assemblée tel que défini dans le projet Visual Studio.
La meilleure solution que j'ai trouvé (pour éviter de coder en dur l'espace de noms par défaut comme une chaîne de caractères quelque part) est de veiller à ce que votre ressource de code de chargement se passe TOUJOURS à partir de l'intérieur de la classe qui est également dans l'espace de noms par défaut et puis, le lendemain, près-approche générique peut être utilisé.
Cet exemple est le chargement d'un schéma intégré.
XmlSchema mySchema;
string resourceName = "MyEmbeddedSchema.xsd";
string resourcesFolderName = "Serialisation";
string manifestResourceName = string.Format("{0}.{1}.{2}",
this.GetType().Namespace, resourcesFolderName, resourceName);
using (Stream schemaStream = currentAssembly.GetManifestResourceStream(manifestResourceName))
mySchema = XmlSchema.Read(schemaStream, errorHandler);
Voir aussi: Comment obtenir de l'espace de Noms d'un ensemble?
Edit: Aussi remarqué une très détaillée de la réponse à la question que je vais répondre à http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/3a469f5d-8f55-4b25-ac25-4778f260bb7e
Un autre modifier dans le cas où les gens avec la même question de recherche: Excellente idée pour résoudre le chargement de ressources de question ici: Comment obtenir de l'espace de noms par défaut de projet csproj (VS 2008)
Il peut y avoir un certain nombre d'espaces de noms dans un assembly donné, et rien ne les oblige à tous démarrer à partir d'une racine commune. Le mieux que vous puissiez faire serait de réfléchir sur tous les types d'un assemblage et de créer une liste des espaces de noms uniques qui y sont contenus.
Les assemblées n'ont pas forcément besoin d'un espace de noms racine. Les espaces de noms et les Assemblages sont orthogonaux.
Ce que vous cherchez peut-être, au contraire, est de trouver un type au sein de cette Assemblée, et avant de trouver son espace de noms.
Vous devriez être en mesure d'accomplir cela en utilisant le GetExportedTypes() membre, puis en utilisant l'espace de Noms de la propriété d'un retour de Type poignées.
Encore une fois cependant, aucune garantie que tous les types sont dans le même espace de noms (ou dans le même espace de noms de la hiérarchie).
Obtenir les types vous donne une liste des objets Type définis dans l'assemblage. Cet objet a une propriété d'espace de noms. N'oubliez pas qu'un assembly peut avoir plusieurs espaces de noms.