Frage

eine Instanz von System.Reflection.Assembly gegeben.

War es hilfreich?

Lösung

Nicht möglich. Nichts gibt einen „Root“ Namespace. Der Standard-Namespace in den Optionen ist ein Visual Studio Ding, keine .net Sache

Andere Tipps

Ich habe über dieses Dilemma viele Male kommen, wenn ich eine Ressource aus der aktuellen Assembly durch seine offensichtlichen Ressourcenstrom geladen werden soll.

Die Tatsache ist, dass, wenn Sie eine Datei als Ressource in der Assembly mit Visual Studio seiner manifest Ressourcennamen aus dem Standard-Namespace der Baugruppe abgeleitet werden einzubetten, wie in dem Visual Studio-Projekt definiert.

Die beste Lösung, die ich habe kommen mit (hartzucodieren den Standard-Namespace als String irgendwo zu vermeiden), ist einfach Ihre Ressource Ladecode zu gewährleisten immer geschieht von innen einer Klasse, die auch im Standard-Namespace ist und dann die folgend in der Nähe von Generischer Ansatz verwendet werden kann.

In diesem Beispiel wird das Laden eines eingebetteten Schema.

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

Siehe auch: Wie kommt man Namespace eines Assembly ?

Edit: Auch eine sehr ausführliche Antwort auf die Frage bemerkte ich unter http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/3a469f5d-8f55-4b25-ac25-4778f260bb7e

Ein weitere bearbeitet bei Menschen mit gleicher Frage kommen suchen: Ausgezeichnete Idee, die Ressource-Lade Frage zu lösen hier: Wie den Standard-Namespace von Projekt csproj bekommen (vS 2008)

Es könnte eine beliebige Anzahl von Namensräumen in einer bestimmten Versammlung sein, und nichts verlangt, dass sie alle aus einer gemeinsamen Wurzel beginnen. Das Beste, was Sie tun könnten, wäre, die Typen alle in einer Baugruppe zu reflektieren über eine Liste der eindeutigen Namensräume darin enthaltenen aufzubauen.

Baugruppen müssen nicht unbedingt einen Root-Namespace. Namensräume und Baugruppen sind orthogonal.

Was können Sie denn statt suchen, ist eine Art innerhalb dieser Versammlung zu finden, und dann herauszufinden, was sein Namensraum ist.

Sie sollten in der Lage sein, dies zu erreichen, indem sie das GetExportedTypes () verwendet Mitglied und dann die Namespace-Eigenschaft unter Verwendung von einem des zurückGriffe.

Auch hier allerdings keine Garantien alle Typen im gleichen Namensraum (oder sogar im selben Namespace-Hierarchie).

Ich habe gerade eine leere interne Klasse namens Root und steckte es in die Projektwurzel (vorausgesetzt, dies wird Ihr Root-Namespace). Dann benutze ich diese überall brauche ich den Stammnamespace:

typeof(Root).Namespace;

sicher, ob ich eine nicht verwendete Datei am Ende, aber es ist sauber.

GetType(frm).Namespace

frm ist das Startformular

Get Typen gibt ein Liste der Typ Objekte in der Baugruppe definiert. Das Objekt verfügt über eine Namespace-Eigenschaft. Denken Sie daran, dass eine Baugruppe mehrere Namensräume haben kann.

Namespaces hat nichts mit Baugruppen zu tun - jede Zuordnung zwischen einem Namespace und den Klassen in einer Baugruppe eine Namenskonvention rein zurückzuführen ist (oder Zufall)

.

Es eigentlich eine indirekte Art und Weise ist, es zu erhalten, indem Sie die Namen der offensichtlichen Ressourcen Versammlung aufzählt. Der Name, den Sie möchten, endet mit dem Teil davon, die Sie kennen.

Anstatt den Code hier wiederholen, finden Sie Standard-Namespace-Namen erhalten für Assembly.GetManifestResourceStream () -Methode

Ich verwende typeof(App).Namespace in meiner WPF-Anwendung. App-Klasse ist obligatorisch für jede WPF-Anwendung und es ist in root befindet.

Die Frage, die ich, dass hatte mich hier gelandet war: „Wenn ich rufe Bibliothek Code N Methoden tief und will den Namespace des Projektes - zum Beispiel des MVC-app, die tatsächlich ausgeführt hat - wie mache ich das bekommen“

Ein wenig hacky, aber Sie können nur einen Stacktrace und Filter greifen:

    public static string GetRootNamespace()
    {
        StackTrace stackTrace = new StackTrace();
        StackFrame[] stackFrames = stackTrace.GetFrames();
        string ns = null;
        foreach(var frame in stackFrames)
        {
            string _ns = frame.GetMethod().DeclaringType.Namespace;
            int indexPeriod = _ns.IndexOf('.');
            string rootNs = _ns;
            if (indexPeriod > 0)
                rootNs = _ns.Substring(0, indexPeriod);

            if (rootNs == "System")
                break;
            ns = _ns;
        }

        return ns;
    }

Das alles tut, um die Stacktrace bekommen, läuft die Methoden von zuletzt root genannt, und Filterung für System. Sobald sie ein System findet nennen es weiß, dass es zu weit weg ist, und gibt Ihnen den Namespace unmittelbar darüber. Egal, ob Sie einen Unit-Test, einen MVC-App oder einen Dienst ausgeführt wird, wird der Systemcontainer gehen zu sitzen 1 Ebene tiefer als die Stammnamespace des Projektes, so voila.

In einigen Szenarien, in denen Systemcode ist ein Vermittler (wie System.Task) entlang der Spur dies die falsche Antwort zurückkehren wird. Mein Ziel war es zum Beispiel einig Startup-Code zu nehmen und lassen Sie es einfach eine Klasse oder Controller-oder was auch immer in der Wurzel-Namespace finden, auch wenn der Code macht die Arbeit in einer Bibliothek sitzt heraus. Dadurch wird erreicht, dass die Aufgabe.

Ich bin sicher, dass verbessert werden kann. - Ich bin sicher, dass diese Hacky Art, die Dinge können in vielerlei Hinsicht verbessert werden, und Verbesserungen sind willkommen

Zusätzlich zu allen anderen Antworten hier, hoffentlich braucht keine Informationen, hier ist, wie ich dies mit Linq gelöst. Meine Situation ist ähnlich wie Lisas Antwort.

Meine Lösung ist mit den folgenden Einschränkungen:

  • Sie verwenden Visual Studio und haben einen Root-Namespace für Ihr Projekt definiert, die ich übernehmen wird, was Sie fragen, da Sie den Begriff „Stammnamespace“ verwenden
  • Sie sind nicht Interop Typen von referenzierten Assemblys Einbetten
Dim baseNamespace = String.Join("."c,
    Me.GetType().Assembly.ManifestModule.GetTypes().
        Select(Function(type As Type)
                    Return type.Namespace.Split("."c)
                End Function
        ).
        Aggregate(Function(seed As String(), splitNamespace As String())
                        Return seed.Intersect(splitNamespace).ToArray()
                    End Function
        )
)

Hier als eher einfache Art und Weise den Stammnamespace für ein Website-Projekt zu erhalten.

''' <summary>
''' Returns the namespace of the currently running website
''' </summary>
Public Function GetWebsiteRootNamespace() As String
    For Each Asm In AppDomain.CurrentDomain.GetAssemblies()
        If Asm Is Nothing OrElse Asm.IsDynamic Then Continue For

        For Each Typ In Asm.GetTypes
            If Typ Is Nothing OrElse Typ.Name Is Nothing Then Continue For
            If Typ.Name = "MyProject" Then Return Typ.Namespace.Split("."c)(0)
        Next
    Next

    Return Nothing
End Function

Dieses einfach überprüft alle geladenen Baugruppen für die „MyProject“ Typ und gibt den Stammnamespace für diesen Typ. Dies ist nützlich für die Protokollierung, wenn Sie mehr Web-Projekte in einer einzigen Lösung haben ein Log-System teilen. Hoffe, das hilft jemand.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top