Toon posts:

[.NET]Eigen versiebeheer van DLL's en de GAC

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi, ik zit met wat onzekerheid en misschien dat jullie het weg kunnen nemen.

Stel: Ik zet in een assembly het versie nummer vast, bv 1.0.0.0. Nu voeg ik de gecompileerde DLL toe aan de GAC.

Ik heb nu een (of meerdere) webapplicatie die gebruik gaan maken van deze DLL. De eerste keer dat ik de website open wordt de DLL dus gecached.

Nu build ik de DLL opnieuw en overschrijf de oude. Deze heeft echter dus nog steeds versie 1.0.0.0.

Klopt het dan dat de websites die de oude versie 1.0.0.0 al gecached hadden, geen gebruik zullen maken van de nieuwe 1.0.0.0?

[ Voor 2% gewijzigd door Verwijderd op 14-11-2003 15:09 . Reden: typo ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Volgens mij maak .net gebruik van file monitors om te kijken of er wijzigingen plaats vinden. En als er wat gewijzigd is wordt de nieuwe dll geladen.

Maar dit kan je toch heel makkelijk even testen?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op 14 november 2003 @ 15:14:
Volgens mij maak .net gebruik van file monitors om te kijken of er wijzigingen plaats vinden. En als er wat gewijzigd is wordt de nieuwe dll geladen.
Klinkt logisch
Maar dit kan je toch heel makkelijk even testen?
Ja dat heb ik gedaan. En het lijkt er op dat-ie gewone oude DLL blijft gebruiken. Maar omdat dat me niet logisch lijkt (zie bovenstaand) hoop ik hier wat meer zekerheid te krijgen.

[ Voor 1% gewijzigd door Verwijderd op 14-11-2003 15:18 . Reden: typo ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Verwijderd schreef op 14 november 2003 @ 15:08:
Stel: Ik zet in een assembly het versie nummer vast, bv 1.0.0.0. Nu voeg ik de gecompileerde DLL toe aan de GAC.
Let wel: 'toevoegen' aan de GAC is niets anders dan een registratie van de DLL toevoegen aan de GAC, dus waar assembly A met signature S te vinden is op de harddisk.
Ik heb nu een (of meerdere) webapplicatie die gebruik gaan maken van deze DLL. De eerste keer dat ik de website open wordt de DLL dus gecached.
Nee. Hij wordt ingeladen in de CLR. De CLR leest de DLL vanuit de dir die de GAC aanwijst.
Nu build ik de DLL opnieuw en overschrijf de oude. Deze heeft echter dus nog steeds versie 1.0.0.0. Klopt het dan dat de websites die de oude versie 1.0.0.0 al gecached hadden, geen gebruik zullen maken van de nieuwe 1.0.0.0?
Nee dat klopt niet. Omdat de CLR de dll geladen heeft van dir D, en die file is geupdate, zal de CLR de nieuwe DLL inladen, terwijl de webapp opnieuw wordt gestart.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Bedankt voor de uitleg! Nu kan ik in ieder geval kijken wat ik verkeerd doe, zonder me steeds af te vragen of het 'idee' wel klopt.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
EfBe schreef op 14 november 2003 @ 16:27:
[...]

Nee. Hij wordt ingeladen in de CLR. De CLR leest de DLL vanuit de dir die de GAC aanwijst.

Nee dat klopt niet. Omdat de CLR de dll geladen heeft van dir D, en die file is geupdate, zal de CLR de nieuwe DLL inladen, terwijl de webapp opnieuw wordt gestart.
Er wordt toch gechecked of een assembly reeds geladen werd, en als dit zo is, wordt die assembly toch gebruikt?
The runtime uses the following steps to resolve an assembly reference:

1. Determines the correct assembly version by examining applicable configuration files, including the application configuration file, publisher policy file, and machine configuration file. If the configuration file is located on a remote machine, the runtime must locate and download the application configuration file first.

2. Checks whether the assembly name has been bound to before and, if so, uses the previously loaded assembly.

3. Checks the global assembly cache. If the assembly is found there, the runtime uses this assembly.

4. Probes for the assembly using the following steps:
• If configuration and publisher policy do not affect the original reference and if the bind request was created using the Assembly.LoadFrom method, the runtime checks for location hints.
• If a codebase is found in the configuration files, the runtime checks only this location. If this probe fails, the runtime determines that the binding request failed and no other probing occurs.
• Probes for the assembly using the heuristics described in the probing section. If the assembly is not found after probing, the runtime requests the Windows Installer to provide the assembly. This acts as an install-on-demand feature.
Note There is no version checking for assemblies without strong names, nor does the runtime check in the global assembly cache for assemblies without strong names.

https://fgheysels.github.io/


  • EfBe
  • Registratie: Januari 2000
  • Niet online
whoami schreef op 14 november 2003 @ 16:32:
[...]
Er wordt toch gechecked of een assembly reeds geladen werd, en als dit zo is, wordt die assembly toch gebruikt?
Ja, maar als DIE assembly file wijzigt, dan wordt hij opnieuw geladen. :) Wat jij quote is hoe een assembly gevonden wordt, dat is duidelijk dat is via de GAC in dit geval.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Goed, ik heb nog even het een en ander getest.

Als ik de DLL, die door de verschillende webapplicaties gebruik wordt, opnieuw build, merk ik niets van de wijizigingen wanneer ik zo'n webapplicatie open. Het lijkt dus op dat-ie de oude versie nog gebruikt (let wel: versienummer is gelijk).

Ook de webapplicatie zelf opnieuw builden heeft geen effect.

Wanneer ik echter m'n webserver reboot en dan de webapplicatie opniew open, zijn de wijzigingen wel zichtbaar.

Is dit te verklaren?

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Kennelijk checkt de CLR niet alleen de NTFS timestamp maar ook de signature, en die is gelijk dus wordt niet opnieuw ingeladen zo te zien.

(rebooten is niet nodig hoor, even de web.config file in notepad inladen, saven, klaar: je app wordt opnieuw gestart bij de volgende request)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Okee. Het wil me nog niet helemaal lukken, maar ik experimenteer nog even wat verder. Bedankt.

Een andere vraag die er wel iets mee te maken heeft:

mbv GACUTIL kun je assemblies aan de GAC toevoegen. Is het mogelijk om vanaf een werkstation de GAC van een server aan te passen? Dus assemblies toevoegen en verwijderen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Je kan assemblies ook gewoon aan de GAC toevoegen (of verwijderen) door ze naar de %windir%\assembly directory te kopieren (of te verwijderen).
Het zou je dus misschien wel lukken als je die directory shared, maar echt aan te raden is dat imo niet.

Als je die assembly wilt deployen als je je website deployed, dan kan je altijd een web-setup project maken enzo.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Als ik bijvoorbeeld in de verkenner in %windir%\assembly op m'n lokale pc kijk, ik de GAC van m'n lokale pc zie.

Het bizarre is dat als ik naar de %windir%\assembly van de server browse - dus vanaf m'n lokale pc - ik OOK de gegevens van de GAC van m'n lokale pc zie.

Op zich wel te verklaren. Maar over het netwerk naar %windir%\assembly kopieren, result in het toevoegen van de assembly aan de GAC op m'n lokale PC :(

[ Voor 5% gewijzigd door Verwijderd op 18-11-2003 14:50 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Verwijderd schreef op 18 november 2003 @ 14:49:
Als ik in bijvoorbeeld de verkenner in %windir%\assembly op m'n lokale pc kijk, ik de GAC van m'n lokale pc zie.

Het bizarre is dat als ik naar de %windir%\assembly van de server browse - dus vanaf m'n lokale pc - ik OOK de gegevens van de GAC van m'n lokale pc zie.

Op zich wel te verklaren. Maar over het netwerk naar %windir%\assembly kopieren, result in het toevoegen van de assembly aan de GAC op m'n lokale PC :(
Tja, het is wel logisch he dat je dat niet kan. :)

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 18 november 2003 @ 14:50:
[...]


Tja, het is wel logisch he dat je dat niet kan. :)
Klopt... maar dat lost het probleem nog niet op :)

Deployen via een setup is ook nog niet aan de orde. Ik wil graag dat wanneer ik in m'n development omgeving de betreffende assembly opnieuw build, niet alle webapplicaties die er gebruik van maken opnieuw te builden.

M'n plan is na een succesvolle build, de nieuwe versie automatisch aan de GAC op de server toe te voegen. En vervolgens in machine.conf alle oude versies te binden aan de nieuwe versie.

Puur dus om het ontwikkelen en testen snel en makkelijk te kunnen doen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Verwijderd schreef op 18 november 2003 @ 14:57:
[...]

Deployen via een setup is ook nog niet aan de orde. Ik wil graag dat wanneer ik in m'n development omgeving de betreffende assembly opnieuw build, niet alle webapplicaties die er gebruik van maken opnieuw te builden.
Dat hoef je ook niet te doen.
Je kan desnoods een ander versie-nr aan die betreffende assembly geven, en dan mbhv een publisher policy specifieer je dat je webapps die nieuwe versie moeten gebruiken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ook dat heb ik geprobeerd :)

Maar als ik dat doe *zonder* de nieuwe versie in de GAC te zetten, wordt de nieuwe versie niet gevonden.

Naast een publisher policy zul je de nieuwe assembly toch echt aan de GAC toe moeten voegen. Toch?

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Verwijderd schreef op 18 november 2003 @ 15:02:
Ook dat heb ik geprobeerd :)

Maar als ik dat doe *zonder* de nieuwe versie in de GAC te zetten, wordt de nieuwe versie niet gevonden.

Naast een publisher policy zul je de nieuwe assembly toch echt aan de GAC toe moeten voegen. Toch?
Tja, die zal je idd op de een of andere manier moeten deployen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Okee, verder kom ik er dan wel uit denk ik. Er is me in ieder geval een hoop duidelijker geworden dit topic, bedankt.
Pagina: 1