Mislim da je tvoj kolega malo pogresno skapirao sve ovo
Prvo, manged objekti ne mogu direktno da se kreiraju iz unmanaged koda. Cak i kad to izgleda tako (npr iz C++-a), uvek postoji context-switch wrapper koji prebacuje iz jednog rezima u drugi.
Dalje, GC.KeepAlive(this) je potpuno nepotrebno u bilo kom kontekstu posto GC sasvim sigurno nece unistiti objekat dok je neki thread unutar koda tog objekta, taman posla da je to moguce morao bi na kraj svakog metoda da stavis KeepAlive

. KeepAlive se koristi kad hoces da se osiguras da neki DRUGI objekat opstane do odredjenog trenutka u nekoj metodi i verovao ili ne KeepAlive ne radi apsolutno nista, blanko, on samo postoji da bi se GC prevario da postoji jos upotrebi odredjene reference te da je ne bi unistio pre vremena. Pogledaj opis KeepAlive metode u MSDNu za primer gde se to koristi.
Trece, lock u Dispose() ne moze da blokira GC, GC uvek ide kroz stablo generacije i redi jednu od tri stvari:
1. ako ima zivih referenci ostavlja objekat na miru i promovise ga u sledecu generaciju
2. ako nema referenci unistava referencu i oslobadja memoriju AKO i SAMO AKO je objekat zadovoljava jednu od tri stavke
a) objekat je value type kreiran na managed heap-u
b) objektu je u nekom trenutku bio pozvan SuppressFinalize()
c) objekat kojem je odradjen finalize() (vidi 3.)
3. ako nema referenci i ako finalizer nije suspendovan, prebacuje finalizer tog objekat u finalizer queue ako vec nije tamo i ignorise objekat do sledeceg ciklusa kad ce taj objekat uz malo srece potpasti pod 2c.
lock u dispose() moze teroijski samo da blokira GC finalizer thread, sto nije bas pametno jer usporava isti sto je tebi zapalo za oko. Medjutim to se nikad nece desiti jer da bi finalizer thread pozvao finalize tog objekta on prvo mora da bude bez zivih reference, sto ce reci nijedan thread tada ne moze da pozove Foo() jer nema referencu
[EDIT]
Samo mala izmena, znam da me nesto mucilo oko ovoga, zapravo KeepAlive(this) ima primenu i to samo u retkim situacijama kad iz metode objekta pozivas staticki metod (dakle napustas this), u toj situacji GC moze da pocisti objekat (this) i pre nego sto staticki metod pocne da radi (pod uslovom da se nista vise ne desava posle poziva statickog metoda) sto moze da izazove problem ako objekat sadrzi unmanaged resurs koji se prebacuje statickoj metodi (za managed resurs nema problema, GC onda nece ocistiti objekat jer je prebacena ziva referenca) i onda ne-staticki metod mora da pozove KeepAlive(this) da bi osigurao svoje prezivljavanje i sprecio svoje unistenje dok staticka metoda ne obavi svoje sa unmanaged resursom. To je mislim jedina konkretna primena.
[Ovu poruku je menjao mmix dana 19.05.2008. u 18:00 GMT+1]