web-dev-qa-db-fra.com

Comment obtenir un espace de noms d'une assemblée?

Considérez que j’ai un Assembly (classe bibliothèque dll) que j’ai chargé en utilisant le code suivant, 

Assembly a = Assembly.LoadFrom(@"C:\Documents and Settings\E454935\My Documents\Visual Studio 2005\Projects\nunit_dll_hutt\for_hutt_proj\bin\Debug\asdf.dll");   

et j'ai besoin de connaître le type de l'Assemblée. Pour obtenir le typei, il faut l'espace de noms de l'assembly. 

Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);             

comment puis-je obtenir l'espace de noms dans la ligne ci-dessus.?! comme pour obtenir le Namespace , je dois obtenir le type ..?

Type.Namespace;

c'est-à-dire que je dois obtenir l'espace de noms de l'assembly qui peut être utilisé pour obtenir son type.

Merci d'avance

28
SyncMaster

Utilisez Assembly.GetTypes () - vous obtiendrez une collection de tous les types, puis vous pourrez obtenir la propriété Namespace pour chacun d’eux.

Ensuite, je suppose que vous pouvez simplement vérifier que tous les types ont la même valeur d’espace de noms et utiliser cette valeur. Sinon, ajoutez une autre logique pour détecter quel espace de nom considérer comme primaire.

32
sharptooth

Un assembly peut contenir plusieurs espaces de noms. Je pense que ce que vous voulez vraiment demander, c'est comment obtenir un type d'une assemblée sans spécifier l'espace de noms.

Je ne sais pas s'il existe un meilleur moyen, mais vous pouvez essayer de rechercher un type spécifique comme celui-ci (add - using linq;):

myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")

Cela se produira s'il y a plus d'une classe portant ce nom sous différents espaces de noms (car la méthode Single garantit qu'il n'y en a qu'une).

Pour obtenir une liste des espaces de noms de cette classe, vous pouvez:

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();
21
eglasius

Mis à jour:

IFtheAssembly name&Assembly namespaceare same dans votre projet et que vous gardiez le même thèmeETvous voulez obtenir l'espace de nom du Assemblée actuellement exécutée alors vous pouvez utiliser ceci:

var namespace = Assembly.GetExecutingAssembly().GetName().Name;

Et pour votre assemblée chargée:

var namespace = myAssembly.GetName().Name;

MaisSIle Assembly name & Assembly namespace ne sont pas identiques dans votre projet, vous pouvez utiliser cette méthode:

// Like @eglasius answer >>
// Find all namespaces in the target Assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();
14
RAM

Avec Mono/Xamarin, vous n’avez pas accès à la propriété "NameSpace". Vous pouvez utiliser les éléments suivants à la place:

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
1
Jean

Assembly.GetName().Name vous donnera l'espace de noms par défaut

0
Lance H

Obtenir qu'un Assembly doit contenir presque une classe (ou tout autre type, tel qu'une interface) et qu'ils doivent être contenus dans un espace de noms, qui doit commencer dans l'espace de noms Assembly, le plus court d'entre eux sera le dernier.

Alors, voici la solution que j'ai trouvée:

public string GetAssemblyNamespace(Assembly asm)
{
    string ns = @"";
    foreach (Type tp in asm.Modules.First().GetTypes()) //Iterate all types within the specified Assembly.
        if (ns.Length == 0 ? true : tp.Namespace.Length < ns.Length) //Check whether that's the shortest so far.
            ns = tp.Namespace; //If it's, set it to the variable.
    return ns; //Now it is the namespace of the Assembly.
}

Je trouve juste tous les types dans l'assembly requis et je recherche ce qui est contenu dans l'espace de noms ayant le nom le plus court.

0
Davide Cannizzo

Pour ne prendre que l'espace de noms, suivez le code ci-dessous:

  var Assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the Assembly object
  var nameSpace = Assembly.GetType().Namespace;//Get the namespace

OU

public string GetNamespace(object obj)
{
    var nameSpace = obj.GetType().Namespace;//Get the namespace

    return nameSpace;
}
0
Tiago S