none
Assembly Suchreihenfolge RRS feed

  • Frage

  • Guten Tag zusammen

    ich hatte gerade eine angeregte Diskussion mit einem Kollegen zum Thema 'Suchreihenfolge von Assemblies'.
    Grund für die Diskussion...

    Wir arbeiten mir dem Entity Framework 4.1 und dies schon seit dem CTP4. Soweit so gut - oder auch nicht.
    Bei unserem nightly Build haben wir festgestellt, dass das Entityframework.dll nicht aus dem Verzeichnis gelesen wird aus dem wir dachten.
    Wir sind davon ausgegangen, dass erst die DLL im Programmverzeichnis und den darunter liegenden Strukturen gesucht und geladen wird.

    Aber so wie es nun aussieht wird der GAC als erstes durchsucht.

    Kann mir jemand sagen ob ich da richtig liege ?

    Gruss
    Peter

    Freitag, 29. Juli 2011 07:03

Antworten

  • Hallo Peter,

    nicht nur beim Entity Framework steht der GAC ganz oben in der Suchreihenfolge:

    So sucht Common Language Runtime nach Assemblys

    Gruß Elmar

    P.S.: Falls noch nicht gesehen: ANN: Entity Framework 4.1 - Update 1

    Freitag, 29. Juli 2011 07:21
    Beantworter
  • Hallo Peter,

    • Wir sind davon ausgegangen, dass erst die DLL im Programmverzeichnis und den darunter liegenden Strukturen gesucht und geladen wird. Aber so wie es nun aussieht wird der GAC als erstes durchsucht.

    Je nach Lade-Methode (dynamisch, statisch) und Konfigurations-Einstellungen und den vorher geladenen Assemblies wird zuerst im GAC gesucht [Referenz].
    Prüfen kannst Du den DLL-Pfad zum Beispiel mit:

          Assembly asm = typeof(System.Data.Entity.DbContext).Assembly;
          MessageBox.Show(asm.Location);

     Das sollte dann etwas wie folgendes ergeben:

          C:\Windows\Microsoft.Net\assembly\GAC_MSIL\EntityFramework\v4.0_4.1.0.0__b77a5c561934e089\EntityFramework.dll

    Das GAC Bindung ist aber normal die empfehlenswerte.
    Du kannst aber die Assembly-Bindung auch Deinen Wünschen entsprechend umleiten:

    [Umleitung der Assemblybindung]
    http://msdn.microsoft.com/de-de/library/2fc472t2.aspx

    [Schritt 4: Suchen der Assembly mit CodeBases oder durch Sondierung]
    http://msdn.microsoft.com/de-de/library/15hyw9x3.aspx

    [Konfigurieren der Umleitung der Assemblybindung]
    http://technet.microsoft.com/de-de/library/433ysdt1.aspx

     


    ciao Frank
    Freitag, 29. Juli 2011 08:17
  • Hallo Peter,

    Wir sind davon ausgegangen, dass erst die DLL im Programmverzeichnis und den darunter liegenden Strukturen gesucht und geladen wird.

    Das ist nur dann der Fall, wenn die Assembly keinen starken Namen hat, oder über Konfiguration mitgeteilt wird, dass an eine andere Assemblyversion gebunden werden soll. Wird die statisch gelinkte, stark benannte Assemblyversion im GAC gefunden, wird immer an die GAC-Version gebunden. Der Publisher kann zusätzlich über sog. Herausgeberrichtliniendateien festlegen, an welche Version tatsächlich gebunden werden soll. Das betrifft dann alle Anwendungen, welche die Assembly referenzieren (überschreibt den evtl. im App.config vorhandenen bindingRedirect-Eintrag, wenn kein <publisherPolicy apply="no" />-Element dort existiert). Du kannst Dir auch selbst Klarheit über die erfolgte Bindung verschaffen, indem Du dir die einzelnen Phasen der Bindung über fuslogvw.exe ansiehst.

    Umleiten von Assemblyversionen:
    http://msdn.microsoft.com/de-de/library/7wd6ex19.aspx

    Fuslogvw.exe (Assembly Binding Log Viewer-Tool)
    http://msdn.microsoft.com/de-de/library/e74a18c4(v=VS.100).aspx
     

    Gruß
    Marcel


    Freitag, 29. Juli 2011 08:35
    Moderator

Alle Antworten

  • Hallo Peter,

    nicht nur beim Entity Framework steht der GAC ganz oben in der Suchreihenfolge:

    So sucht Common Language Runtime nach Assemblys

    Gruß Elmar

    P.S.: Falls noch nicht gesehen: ANN: Entity Framework 4.1 - Update 1

    Freitag, 29. Juli 2011 07:21
    Beantworter
  • Hallo Peter,

    • Wir sind davon ausgegangen, dass erst die DLL im Programmverzeichnis und den darunter liegenden Strukturen gesucht und geladen wird. Aber so wie es nun aussieht wird der GAC als erstes durchsucht.

    Je nach Lade-Methode (dynamisch, statisch) und Konfigurations-Einstellungen und den vorher geladenen Assemblies wird zuerst im GAC gesucht [Referenz].
    Prüfen kannst Du den DLL-Pfad zum Beispiel mit:

          Assembly asm = typeof(System.Data.Entity.DbContext).Assembly;
          MessageBox.Show(asm.Location);

     Das sollte dann etwas wie folgendes ergeben:

          C:\Windows\Microsoft.Net\assembly\GAC_MSIL\EntityFramework\v4.0_4.1.0.0__b77a5c561934e089\EntityFramework.dll

    Das GAC Bindung ist aber normal die empfehlenswerte.
    Du kannst aber die Assembly-Bindung auch Deinen Wünschen entsprechend umleiten:

    [Umleitung der Assemblybindung]
    http://msdn.microsoft.com/de-de/library/2fc472t2.aspx

    [Schritt 4: Suchen der Assembly mit CodeBases oder durch Sondierung]
    http://msdn.microsoft.com/de-de/library/15hyw9x3.aspx

    [Konfigurieren der Umleitung der Assemblybindung]
    http://technet.microsoft.com/de-de/library/433ysdt1.aspx

     


    ciao Frank
    Freitag, 29. Juli 2011 08:17
  • Hallo Peter,

    Wir sind davon ausgegangen, dass erst die DLL im Programmverzeichnis und den darunter liegenden Strukturen gesucht und geladen wird.

    Das ist nur dann der Fall, wenn die Assembly keinen starken Namen hat, oder über Konfiguration mitgeteilt wird, dass an eine andere Assemblyversion gebunden werden soll. Wird die statisch gelinkte, stark benannte Assemblyversion im GAC gefunden, wird immer an die GAC-Version gebunden. Der Publisher kann zusätzlich über sog. Herausgeberrichtliniendateien festlegen, an welche Version tatsächlich gebunden werden soll. Das betrifft dann alle Anwendungen, welche die Assembly referenzieren (überschreibt den evtl. im App.config vorhandenen bindingRedirect-Eintrag, wenn kein <publisherPolicy apply="no" />-Element dort existiert). Du kannst Dir auch selbst Klarheit über die erfolgte Bindung verschaffen, indem Du dir die einzelnen Phasen der Bindung über fuslogvw.exe ansiehst.

    Umleiten von Assemblyversionen:
    http://msdn.microsoft.com/de-de/library/7wd6ex19.aspx

    Fuslogvw.exe (Assembly Binding Log Viewer-Tool)
    http://msdn.microsoft.com/de-de/library/e74a18c4(v=VS.100).aspx
     

    Gruß
    Marcel


    Freitag, 29. Juli 2011 08:35
    Moderator