Wir entwickeln mehrere Anwendungen in Visual Studio 2010 mit C # und .NET 4.0 unter Windows. Zwei SilverLight-Anwendungen, die Dienste aus mehreren WCF-Projekten verwenden. Ein anderes ist eine Konsolenanwendung.
Wir wollen einige "allgemeine" Funktionen in ein separates Bibliotheksprojekt einfügen, um Code zu faktorisieren und wiederzuverwenden. Diese Bibliothek muss wissen, ob die Anwendung wie die WCF-Dienste gehostet wird (IIS, ASP.NET ...) oder aufgrund einer anderen Dateipfadbehandlung als Konsolenanwendung ausgeführt wird.
Wenn diese Frage gegoogelt wird, zeigt die Person die Verwendung von System.Web.dll an, um zu wissen, ob der Code gehostet wird, unter Verwendung von HttpContext, HostingEnvironment.IsHosted ... Das Problem besteht darin, dass ein solcher Ansatz einen Verweis auf System erfordert. Web in dem Bibliotheksprojekt, das nicht akzeptabel ist, wenn diese Bibliothek von einem Konsolenprojekt mit Clientprofil referenziert wird.
Die Idee besteht darin, eine andere Technik zu verwenden, bei der die System.Web-Assembly nicht verwendet wird.
Wenn Sie nur den Pfad zu einer Datei in dem Ordner benötigen, der die Anwendung enthält (wie im Kommentar zu der Frage), können Sie Folgendes verwenden:
%Vor%Bei einer ASP.NET-Anwendung ist dies der Stammordner (wie bei MapPath ("~ /" + Dateiname)), bei einer Konsolenanwendung ist es der Ordner, der die ausführbare Datei enthält.
Vom Kommentar zur ursprünglichen Frage:
Wenn Sie eine as-Konsole-Anwendung ausführen, verwenden Sie einfach den Dateinamen als relativen Pfad
Ich würde nicht empfehlen, einen relativen Pfad zu verwenden. Dies ist relativ zum aktuellen Arbeitsverzeichnis, das nicht mit dem Anwendungsverzeichnis identisch sein kann.
Es gibt mehrere Möglichkeiten, um zu überprüfen, ob eine Anwendung ASP.NET ist oder nicht.
Überprüfen Sie den Namen der Konfigurationsdatei
%Vor%Eine ASP.NET-Anwendung hat keine Eingabeassembly
%Vor%Eine ASP.NET-Anwendung verwendet Schattenkopien aller DLL-Dateien. Ich bin mir jedoch nicht sicher, ob dies bei anderen Arten von Anwendungen möglich ist.
%Vor%Eine weitere Reflektionsidee: Verwenden Sie System.Web, aber durch Reflektion:
AppDomain.CurrentDomain.GetAssemblies()
, um zu sehen, ob System.Web geladen ist; Wenn nicht, sind Sie nicht gehostet Stellt sich heraus, dass das leichter gesagt als getan ist, aber das scheint den Trick zu machen:
%Vor%Die Reflektion ist wahrscheinlich teuer, also führe sie einmal aus und cache das Ergebnis. Ich bin mir auch nicht sicher, was der beste Weg ist, die spezifische Baugruppe und den Typ zu finden, aber dieser Weg funktioniert.
Sie können dies durch Reflektion mithilfe von erreichen GetCallingAssembly Methode. Zum Beispiel
%Vor% Obwohl es sich nicht um eine generische Lösung handelt, können Sie sie mithilfe einer GetReferenceAssemblies
-Methode (beim Aufruf einer Assembly) verbessern.
Da die Silverlight- und Konsolenanwendungen über ihre Umgebung Bescheid wissen, könnten Sie die relevanten Informationen in ihre App.config-Dateien einfügen, sodass die allgemeine Bibliothek über die Konfiguration auf die Umgebungsinformationen zugreifen kann, anstatt sie selbst zu erstellen.
Wahrscheinlich ist es am einfachsten, ein Enum in der Bibliothek der verschiedenen Anwendungstypen zu erstellen, für die die Bibliothek verwendet wird. Erstellen Sie eine Variable in der Bibliothek mit der Enumeration. Dann muss die App, die die Bibliothek verwendet, die Variable mit dieser Enumeration festlegen und die Bibliothek wird dann wissen, welche Art von App sie verwendet.
So:
%Vor%Sie können auch einen Parameter des Typs enum type applicationType als Teil der Aufrufe der Bibliotheksmethode angeben und dadurch den Anwendungstyp ermitteln. Dann, egal was, Sie wissen immer, da es ein erforderlicher Parameter ist.