Wie kann C# - Code für die Bibliothek weiß, dass es hosting-Anwendung, geben Sie ohne System.Web.dll?
Wir entwickeln verschiedene Anwendungen in Visual Studio 2010 mit C# und .NET 4.0 auf Windows. Zwei SilverLight-Anwendungen mit Leistungen von mehreren WCF-Projekte. Ein anderes ist eine Konsole-Anwendung.
Wollen wir einige "gewöhnliche" Funktionen in eine getrennte Library-Projekt, um zu faktorisieren und die Wiederverwendung von code. Diese Bibliothek muss wissen, wenn die Anwendung gehostet wird (IIS, ASP.NET...), wie dem WCF-Dienst oder als Konsolenanwendung ausgeführt wird, aufgrund von verschiedenen Datei-Pfad Handhabung.
Googeln diese Frage, Menschen gibt die Verwendung von System.Web.dll um zu wissen, ob der code gehostet wird, mit HttpContext, HostingEnvironment.IsHosted... Das problem ist, dass ein solcher Ansatz erfordert, um einen Verweis auf System.Web int er-Bibliothek-Projekt, da es nicht akzeptabel, wenn diese Bibliothek referenziert werden, die von einer Konsole-Projekt mit Client-Profil.
Die Idee ist, verwenden Sie eine andere Technik, die nicht mit der Nutzung des Systems.Web-Montage.
- "wegen der unterschiedlichen Datei-Pfad-handling" - Datei Pfad Handhabung nicht anders sein muss zwischen ASP.NET -und Konsolen-Anwendungen. Wenn du genau erklären, warum Sie denken, Sie brauchen, jemand kann in der Lage sein, um die post eine Lösung, die verhindert, dass die Bibliothek-Klasse benötigen, um wissen über Ihre hosting-app.
- Wenn die Bibliothek gehostet wird, um den Pfad der Datei in dem gleichen Ordner wie die Bibliothek/Anwendung, müssen wir
HostingEnvironment.MapPath("~/" + fileName)
Zuordnung des virtuellen Pfad zum physikalischen Pfad; wenn Sie eine Konsole-Anwendung, verwenden Sie einfach diefilename
als relativer Pfad. - Siehe meine Antwort, können Sie die Anwendung Ordner mit AppDomain.BaseDirectory.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nur brauchen, um den Pfad zu einer Datei in dem Ordner mit der Anwendung (wie in dem Kommentar auf eine Frage), die Sie verwenden können:
Für eine ASP.NET Anwendung, wird der root-Ordner (der gleiche wie MapPath("~/" + filename)), für eine Konsole-Anwendung, es wird der Ordner mit der ausführbaren Datei.
Kommentar zur ursprünglichen Frage:
Ich würde nicht empfehlen, mit einem relativen Pfad. Diese werden relativ zum aktuellen Arbeitsverzeichnis, die möglicherweise nicht das gleiche wie das Verzeichnis der Anwendung.
Gibt es mehrere Möglichkeiten, um zu überprüfen, ob eine Anwendung ASP.NET oder nicht.
Überprüfen Sie den Namen der Konfigurationsdatei
Einer ASP.NET die Anwendung hat keinen Eintrag assembly
Einer ASP.NET Anwendung verwendet Schattenkopien von allen .dll-Dateien. Allerdings bin ich mir nicht sicher, ob dies möglich ist, in andere Arten von Anwendungen.
Anderen Reflexions-Idee: verwenden Sie System.Web, sondern durch Reflexion:
AppDomain.CurrentDomain.GetAssemblies()
um zu sehen, ob System.Web ist geladen; wenn nicht, bist du nicht hostedStellt sich heraus, dass ist leichter gesagt als getan, aber das scheint, den trick zu tun:
Die Reflexion ist wahrscheinlich teuer, so einmal ausgeführt und cache das Ergebnis. Ich bin mir auch nicht sicher, was der beste Weg zu finden, die konkrete Versammlung und der Typ ist, aber auf diese Weise funktioniert.
können Sie dies durch Reflexion mithilfe GetCallingAssembly Methode. Zum Beispiel
Obwohl es nicht eine generische Lösung, die Sie verbessern können, indem er eine
GetReferenceAssemblies
- Methode (auf der aufrufenden assembly).GetReferenceAssemblies
können Sie wusste, dass es leicht istSystem.Web
geladenDa die Silverlight-und Konsolen-Anwendungen, wissen über Ihre Umwelt, Sie könnten die relevanten Informationen in Ihre App.config-Dateien, so dass das gemeinsame Bibliothek zugreifen kann die Umwelt Informationen über die Konfiguration, anstatt zu versuchen, es herauszufinden, selbst.
Wahrscheinlich die einfachste Sache zu tun ist, erstellen Sie ein enum in der Bibliothek von den verschiedenen Arten von Anwendungen, die die Bibliothek verwendet werden. Erstellen Sie eine variable in der Bibliothek mit dem enum. Dann haben die app, die mithilfe der Bibliothek legen Sie die variable mit enum, und die Bibliothek wird dann wissen, welche Art von app verwendet wird.
Wie diese:
Könnte man auch einen parameter vom Enumerationstyp, applicationType erforderlich als Teil des Bibliotheken-Methode aufrufen, und damit Holen Sie den Typ der Anwendung. Dann, egal was, wissen Sie immer, da ist es ein erforderlicher parameter.