39 votes

Comment obtenir l'espace de noms racine d'un assemblage?

Étant donné une instance de System.Reflection.Assembly .

59voto

Lisa Points 1261

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)

38voto

Darren Kopp Points 27704

Pas possible. Rien ne spécifie un espace de noms "Root". L'espace de noms par défaut dans les options est une chose Visual Studio, pas une chose .net

10voto

Jason Diller Points 2566

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.

5voto

therealhoff Points 1155

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).

1voto

Charles Graham Points 8132

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X