Wie kann der C # -Bibliothekscode wissen, dass er den Anwendungstyp ohne System.Web.dll hostet?

8

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.

    
David Oliván Ubieto 01.03.2011, 12:05
quelle

6 Antworten

8

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.

    
Joe 01.03.2011, 13:44
quelle
8

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%     
Coder 23.03.2012 10:43
quelle
4

Eine weitere Reflektionsidee: Verwenden Sie System.Web, aber durch Reflektion:

  1. benutze AppDomain.CurrentDomain.GetAssemblies() , um zu sehen, ob System.Web geladen ist; Wenn nicht, sind Sie nicht gehostet
  2. Wenn es geladen ist, verwenden Sie reflection, um HostingEnvironment.IsHosted
  3. aufzurufen

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.

    
Rup 01.03.2011 12:44
quelle
1

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.

    
Adeel 01.03.2011 12:38
quelle
0

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.

    
tjrobinson 01.03.2011 12:13
quelle
0

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.

    
richard 01.03.2011 12:20
quelle

Tags und Links