2013-04-15 9 views
9

Ich habe eine Webanwendung Thet hat eine Reihe von Klassenbibliothek Projekte. Ein Beispielcode unten.Wie kann ich Server.MapPath in Klassenbibliothek Projekt

public static class LenderBL 
{ 
    static string LenderXml { get { return "MyPathHere"; } } 

    public static LenderColl GetLenders() 
    { 
     var serializer = new XmlSerializer(typeof(LenderColl)); 

     using (XmlReader reader = XmlReader.Create(LenderXml)) 
     { 
      return (LenderColl)serializer.Deserialize(reader); 
     } 
    } 
} 

Ich würde normalerweise Server.MapPath verwenden Sie den Pfad für die Eigenschaft LenderXml zu bekommen, aber wenn ich es in einer Klassenbibliothek verwenden, wird gibt den Pfad der Stammlösung, das nicht von der Klassenbibliothek Projekt.

Gibt es eine Möglichkeit, den Pfad für das Klassenbibliotheksprojekt selbst zu erhalten?

Vielen Dank im Voraus.

Antwort

28
var Mappingpath = System.Web.HttpContext.Current.Server.MapPath("pagename.aspx"); 

Ich hoffe, es ist hilfreich.

+1

Und Referenz System.Web. –

+2

Die System.Web-Bibliothek muss referenziert werden und nicht nur angegeben werden. –

+1

@ Freelancer - Sorry, vielleicht war ich in meiner Frage nicht klar. Ich kann auf Server.MapPath in der Klassenbibliothek zugreifen, wie es einen Pfad zu dem übergeordneten Projekt zurückgibt. Ich suche einen Weg zum Klassenbibliotheksprojekt. – dotnetnoob

3

Server.MapPath wird immer im Kontext des Webstamms ausgeführt. In diesem Fall ist der Webstamm das übergeordnete Webprojekt. Während Ihre Klassenbibliotheken (Assemblys) wie separate Projekte aussehen, werden sie zur Laufzeit alle im Webprojektprozess gehostet. Es gibt also einige Dinge, die Sie über Ressourcen in den Klassenbibliotheken beachten sollten.

Zunächst überlegen Sie, ob es sinnvoll ist, Ressourcen in der Klassenbibliothek zu behalten. Vielleicht sollten Sie die xml Datei im Webprojekt haben und nur in der Klassenbibliothek darauf verweisen. Dies wäre äquivalent dazu, wie MVC-Projekte ihre Ansichten im Webprojekt beibehalten. Ich nehme jedoch an, dass Sie das nicht tun können.

Zweitens könnten Sie die Build-Eigenschaften Ihrer xml Datei ändern. Wenn Sie die Datei in content und copy-always in seinen Eigenschaften ändern. Die Datei wird in das Verzeichnis bin kopiert. Dann sollte Server.MapPath funktionieren, weil die Datei zugänglich sein wird.

Drittens könnten Sie die Ressource embedded resource machen und dann im Code referenzieren. Auf diese Weise werden alle Ressourcen lokal für eine erstellte Assembly beibehalten.

Hoffe, das hilft.

+0

Dies beantwortet die Frage nicht im Geringsten. –

+2

@GrantThomas Das OP sagt, dass 'Server.MapPath' funktioniert, gibt aber den Pfad des übergeordneten Projekts zurück. Ich kann nur annehmen, dass das Elternprojekt das Webprojekthosting bedeutet. Diese drei Optionen bieten alle Möglichkeiten, den Inhalt der XML-Datei aus dem Code in der referenzierten Bibliothek zu referenzieren. So wie ich es gelesen habe, ist dies eine vollkommen vernünftige Antwort. –

10

Wie kann ich verstehen Sie die aktuelle Montageort müssen

static public string CurrentAssemblyDirectory() 
{ 
    string codeBase = Assembly.GetExecutingAssembly().CodeBase; 
    UriBuilder uri = new UriBuilder(codeBase); 
    string path = Uri.UnescapeDataString(uri.Path); 
    return Path.GetDirectoryName(path); 
} 
+1

Dies ist die einzige Lösung, die ich gefunden habe, die tatsächlich in einer Klassenbibliothek und in einer Webanwendung funktioniert. Vielen Dank –