wake-up-neo.com

Wie bekomme ich den Namespace einer Assembly?

Angenommen, ich habe eine Assembly (Klassenbibliothek-DLL), die ich mit folgendem Code geladen habe, 

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");   

und ich brauche den Typ der Versammlung. Um das type zu erhalten, brauche ich den Namespace der Assembly. 

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

wie kann ich den Namespace in der obigen Zeile erhalten? um den namenraum zu erhalten, muss ich den typ bekommen ..?

Type.Namespace;

ich brauche also den Namespace der Assembly, der verwendet werden kann, um seinen Typ zu erhalten.

Danke im Voraus

28
SyncMaster

Verwenden Sie Assembly.GetTypes (). Dadurch erhalten Sie eine Auflistung aller Typen. Anschließend können Sie die Namespace-Eigenschaft für jeden von ihnen erhalten.

Dann können Sie einfach überprüfen, ob alle Typen denselben Namespace-Wert haben, und diesen Wert verwenden. Fügen Sie andernfalls eine andere Logik hinzu, um festzustellen, welcher Namespace als primär betrachtet werden soll.

32
sharptooth

Eine Assembly kann mehrere Namespaces enthalten. Ich denke, Sie möchten wirklich fragen, wie Sie einen Typ aus einer Assembly erhalten, ohne den Namespace anzugeben.

Ich weiß nicht, ob es einen besseren Weg gibt, aber Sie können versuchen, nach einem bestimmten Typ zu suchen (add - using linq;):

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

Dies wird effektiv ausgelöst, wenn mehr als eine Klasse mit diesem Namen unter verschiedenen Namespaces vorhanden ist (da die Methode Single sicherstellt, dass nur 1 vorhanden ist).

Für eine Liste der Namespaces für diese Klasse haben Sie folgende Möglichkeiten:

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

Aktualisierte:

WENNderAssembly name&Assembly namespacesind gleich in Ihrem Projekt und Sie behalten das Thema unbedingt beiUNDSie wollen den Namespace des aktuell ausgeführte Assembly dann Sie können Folgendes verwenden:

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

Und für Ihre geladene Baugruppe:

var namespace = myAssembly.GetName().Name;

WennWENNder Assembly name & Assembly namespace nicht in Ihrem Projekt identisch sind, können Sie diesen Weg verwenden:

// 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

Mit Mono/Xamarin haben Sie keinen Zugriff auf die Eigenschaft "NameSpace". Sie können stattdessen Folgendes verwenden:

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

Assembly.GetName().Name erhält den Standard-Namespace

0
Lance H

Wenn Sie feststellen, dass eine Assembly fast eine Klasse (oder einen anderen Typ, z. B. eine Schnittstelle) enthalten muss, und diese in einem Namespace enthalten sein müssen, der im Assembly-Namespace beginnen muss, wird der kürzeste von ihnen der letzte sein.

Hier ist die Lösung, die ich gefunden habe:

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

Ich finde nur alle Typen in der erforderlichen Assembly und suche nach dem, der im Namespace mit dem kürzesten Namen enthalten ist.

0
Davide Cannizzo

Um nur den Namespace zu übernehmen, folgt der folgende Code:

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

ODER

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

    return nameSpace;
}
0
Tiago S