Kaip „Microsoft“ sukūrė sąnarius, turinčius apykaitines nuorodas?

„.NET BCL“ yra apvalūs ryšiai tarp:

  • System.dll ir System.Xml.dll
  • System.dll ir System.Configuration.dll
  • System.Xml.dll ir System.Configuration.dll

Čia yra „.NET Reflector“ ekrano kopija, kuri rodo, ką turiu galvoje:

2019

99
22 авг. nustatė Drew Noakes 22 rug. 2009-08-22 20:26 '09, 08:26 pm 2009-08-22 20:26
@ 8 atsakymai

Galiu tik pasakyti, kaip tai daro Mono projektas. Teorija yra gana paprasta, nors ir suteikia kodo sutrikimą.

Pirma, jie kaupia „System.Configuration.dll“ be dalies, kuriai reikia nuorodos į „System.Xml.dll“. Po to jie susistemina System.Xml.dll įprastu būdu. Dabar ateina magija. Jie perskaičiuos System.configuration.dll su dalimi, kuriai reikia nuorodos į System.Xml.dll. Dabar yra sėkmingas rinkinys su apykaitine nuoroda.

Trumpai tariant:

  • A sudarytas be kodo, kurį jums reikia B, ir nuorodą į B.
  • B sudarytas.
  • A perskaičiuota.
54
22 авг. Atsakė Dykam rugpjūčio 22 d 2009-08-22 20:43 '09 ne 20:43 2009-08-22 20:43

RBarryYoung ir Dykam yra kažkas. „Microsoft“ naudoja vidinį įrankį, kuris naudoja ILDASM išmontuoti agregatus, nutraukia visus vidinius / privačius dalykus ir kūno metodus ir perrašo IL (naudodamasis ILASM) į vadinamuosius „dehidratuotus mazgus“ arba metaduomenų surinkimą. Tai daroma kiekvieną kartą, kai keičiasi bendra montavimo sąsaja.

Susirinkimo metu vietoj įprastų naudojami metaduomenys. Taigi ciklas yra sugadintas.

35
22 авг. Atsakymas, kurį pateikė Srdjan Jovcic 22 rugpjūtis 2009-08-22 20:58 '09 ne 20:58 2009-08-22 20:58

Tai galima padaryti, kaip aprašė Dykam, bet „Visual Studio“ blokuoja jus nuo šio.

Jums reikės tiesiogiai naudoti komandinės eilutės kompiliatorių csc.exe.

  • csc / target: biblioteka ClassA.cs

  • csc / target: biblioteka ClassB.cs / nuoroda: ClassA.dll

  • csc / target: biblioteka ClassA.cs ClassC.cs / nuoroda: ClassB.dll

 //ClassA.cs namespace CircularA { public class ClassA { } } //ClassB.cs using CircularA; namespace CircularB { public class ClassB : ClassA { } } //ClassC.cs namespace CircularA { class ClassC : ClassB { } } 
25
22 авг. Atsakyti Alfred Myers 22 rug. 2009-08-22 20:50 '09 ne 20:50 2009-08-22 20:50

Visual Studio yra gana lengva padaryti, jei nenaudojate nuorodų į projektą ... Išbandykite šiuos veiksmus:

  • Atvira vizualinė studija
  • Sukurkite klasės bibliotekos „ClassLibrary1“ ir „ClassLibrary2“ projektus.
  • Kurti
  • „ClassLibrary1“ pridėkite nuorodą į ClassLibrary2, peržiūrėdami 3 veiksme sukurtą DLL.
  • „ClassLibrary2“ pridėkite nuorodą į ClassLibrary1, peržiūrėdami 3 veiksme sukurtą DLL.
  • Sukurkite dar kartą (pastaba: jei atliksite pakeitimus abiejuose projektuose, jums reikės statyti du kartus, kad abi nuorodos būtų „šviežios“).

Taigi taip jūs tai darote. Bet rimtai ... Ar ne kada nors tai darote realiame projekte! Jei tai padarysite, Santa šiais metais nesiims jums dovanų.

16
24 авг. JohannesH atsakymas 24 d. 2009-08-24 06:07 '09, 06:07 am. 2009-08-24 06:07

Manau, kad tai gali būti padaryta pradedant asikliniu surinkimo rinkiniu ir naudojant ILMerge, kad sujungtumėte mažesnes sąsajas į logiškai susijusias grupes.

6
22 авг. Atsakė Steve Gilham rugpjūčio 22 d 2009-08-22 20:29 '09 ne 20:29 2009-08-22 20:29

Na, aš niekada to nepadariau sistemoje „Windows“, bet aš tai padariau daugelyje „rtl-link“ kompiliavimo aplinkų, kurios tarnavo kaip praktiniai pirmtakai. Tai, ką darote, pirmiausia užklijuoja „tikslus“ be kryžminių nuorodų, tada nuorodas, tada priduria apykaitines nuorodas ir tada vėl sujungia. Paprastai saitai nerūpi apskritomis nuorodomis ar vėlesnėmis ref grandinėmis, jie tik rūpinasi galimybe išspręsti kiekvieną nuorodą į ją.

Taigi, jei turite dvi bibliotekas, A ir B, kurios turėtų susieti viena su kita, pabandykite tai padaryti:

  • A nuoroda be nuorodų į B.
  • B nuoroda su nuorodomis į A.
  • A nuoroda, įterpiant nuorodas į B.

Dykam daro gerą tašką, jis rengia, nėra prijungtas prie .Net, tačiau šis principas išlieka toks pat: kad jūsų šaltiniai būtų susieti su jų eksportuotais įvažiavimo taškais, bet visi, išskyrus vieną, turi savo nuorodas į kitus, kurie perėjo. Sukurkite juos taip. Tada atjunkite išorines nuorodas ir atkurkite jas. Tai turėtų veikti net ir be specialių įrankių. Tiesą sakant, šis požiūris dirbo kiekvienoje operacinėje sistemoje, kurią aš kada nors bandžiau (apie 6 iš jų). Nors, žinoma, tai, kas automatizuoja, bus didelė pagalba.

4
22 авг. atsakymą pateikė RBarryYoung 22 rug . 2009-08-22 20:44 '09 ne 20:44 2009-08-22 20:44

Vienas iš galimų būdų yra naudoti sąlyginį kompiliavimą (#if) pirmajam System.dll rinkiniui, kuris yra nepriklausomas nuo šių kitų rinkinių, tada surenka kitus rinkinius ir galiausiai susigrąžina System.dll, kad įtrauktų dalis, priklausomai nuo Xml ir Configuration.

1
22 авг. Atsakymas duotas Daniel 22 rug. 2009-08-22 20:42 '09 ne 20:42 2009-08-22 20:42

Techniškai įmanoma, kad jie visai nebuvo surinkti ir surinkti rankomis. Galų gale, tai yra žemo lygio bibliotekos.

0
06 окт. atsakymas duotas tylermac spalis 06. 2009-10-06 20:02 '09 ne 20:02 2009-10-06 20:02

Kiti klausimai apie „ žymes arba „ Užduoti klausimą“