2010-03-06 16 views
5

In meiner ASP.NET MVC-Anwendung, ich habe folgendes Setup:Was passiert beim Laden einer Baugruppe?

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;extras"/> 

ich im extras Ordner in den Ansichten und sie haben perfekt gelegen Baugruppen verwiesen habe (mit <%@ Import Namespace="myNameSpace" %>) gearbeitet.

Meine Fragen

  1. Was passiert, wenn diese Zeile genannt wird?
  2. Wo wird die Baugruppe geladen?
  3. Warum kann ich die Baugruppe im Ordner extras, die myNameSpace enthält, nicht mit einer neueren Version überschreiben? (Ich erhalte eine Fehlermeldung, dass die Assembly in einem anderen Programm "geöffnet" ist)
  4. Gibt es eine Möglichkeit, die Assembly mit einer neueren Version zu überschreiben, ohne dass die Anwendung neu gestartet werden muss?

Antwort

5

1) Import tut eigentlich nichts zur Laufzeit. Es ist eine Kompilierzeit-Bequemlichkeit, die Sie nur auf Typen verweisen kann, die ihre nicht qualifizierten Namen wie Environment anstelle von System.Environment verwenden.

2) Die Baugruppe wird mit den normalen Baugruppenprüfregeln geladen. Die CLR überprüft verschiedene Standorte vor diese privaten Suchpfade, so dass es wichtig ist, dies zu beachten. Wenn Sie auf eine Assembly mit starkem Namen verweisen und erwarten, diese Assembly in einem privaten Abfragepfad zu finden, wird eine Assembly mit demselben starken Namen (Name, Version, öffentlicher Schlüssel usw.) im GAC bevorzugt. Dies kann manchmal zu unerwartetem Verhalten führen und wird normalerweise durch hartes Codieren einer Assemblyversion in AssemblyInfo.cs und Vergessen, es zu aktualisieren, verursacht.

3) Nach dem Laden kann eine Baugruppe nicht entladen werden, ohne die AppDomain zu entladen. Aber ASP.NET verwendet "Schattenkopieren", was bedeutet, dass Baugruppen vor dem Laden in einen temporären Pfad kopiert werden. Dadurch sollte die ursprüngliche Baugruppe nicht gesperrt und überschrieben werden können. Ich bin mir nicht ganz sicher, warum Sie den Fehler über gesperrte Assemblys bekommen. In einer normalen Windows-Anwendung wäre dies völlig normal und erwartet. Aber ASP.NET ist so konzipiert, dass Sie Inhalt, Code, Assemblys usw. überschreiben können, während die Anwendung läuft, was zu # 4 führt.

4) In der Praxis nein. Da eine Assembly nicht entladen werden kann, gibt es keine Möglichkeit, eine Assembly zu aktualisieren, ohne dass die Webanwendung neu gestartet wird. Technisch gesehen können Sie mehrere Versionen einer Assembly laden, dies würde jedoch nicht die gewünschten Ergebnisse liefern. Alle Kompilierungszeitverweise würden weiterhin auf die alte Assembly verweisen und Sie würden alle Arten von ungültigen Cast-Ausnahmen erhalten, wenn Sie versuchen, die neue Assembly zu verwenden. Aber wie gesagt in # 3, mit ASP.NET Upgrade-Assemblies soll so einfach sein wie das Ersetzen der Dateien und sollte automatisch geschehen. Sie sollten IIS- oder Arbeitsprozesse nicht manuell neu starten müssen.

Die folgenden Links könnten von Interesse sein.

How the Runtime Locates Assemblies
Best Practices for Loading Assemblies
Shadow Copying Assemblies
Unloading Assemblies - Suzanne Cook

UPDATE Nach ein bisschen mehr auf Schatten Kopieren lesen, ich glaube, der Grund, warum Sie könnten das Problem der gesperrten Baugruppen im Extras-Ordner werden sehen, ist dass ASP.NET wahrscheinlich nur den Ordner "bin" für shadow copying angibt.

0
  1. Ich denke, das das gleiche wie eine using-Anweisung in C# ist, bedeutet im Grunde, dass die Klassen Namespace sind jetzt in yoru Seite verwendet werden.
  2. Die Montage wird wahrscheinlich die sicherste Art und Weise
  3. Wenn die Assembly derzeit von der aspnetwp.exe Prozess in den Speicher geladen werden, verwendet wird Sie
  4. Ein Neustart diese Fehlermeldung erhalten wird, ist ich, dies zu tun wissen, könnten Sie Verwenden Sie die Abhängigkeitsinjektion oder die späte Bindung, um das gleiche Ergebnis zu erzielen. Ich würde mich wundern, warum Sie eine Assembly wechseln möchten, während die Anwendung ausgeführt wird?
+0

# 4: Ersetzen Sie es durch eine aktualisierte Version. Ist das möglich während es läuft? – Omar

+0

Wenn Sie Dependency Injection und Programm gegen eine Schnittstelle verwenden, können Sie es leicht tun. – Burt

+0

Könntest du es ausarbeiten ?! – Omar

Verwandte Themen