Eli mitä kaikkea *.dll -tiedostolla voi tehdä ja miten tätä es. omaa tekemää *.dll tidostoa voi käyttää hyväksi vaikkapa C++:salla!? Mitä *.dll tidosto voi sisältää ja mitä kaikkea siihen voi sisällyttää!? Onko jotakin yksinkertaista esimerkkiä *.dll filujen käytöstä!?
Dll-tiedostot (dynamic linked library) ovat kirjastotiedostoja. Ne sisältävät sekalaisen tai vähemmän sekalaisen kokoelman kutsuttavia funktioita. Dll-kirjastojen ideana on tarjota funktiokirjasto jonka funktioita voidaan kutsua useammasta ohjelmasta. Koska Dll-kirjastot ovat dynaamisia, ne ladataan tarvittaessa eikä sen sisältöä ole tarvinnut kääntää omaan ohjelmakoodiin mukaan (tiedostojen koko pysyy pienempänä). Vastakohta tälle on mukaan käännettävät kirjastot.
Kirjastojen tarkoitus on modularisoida ohjelman kehitystä, kun voidaan käyttää valmiita kirjastoja asioiden toteuttamiseen. Tällöin vältytään koodin uudelleen kirjoittamiselta. Kirjastoja käyttäessä kaikkea ei tarvitse osata ohjelmoida itse.
Toimivaa ja tarkkaa ohjetta kirjastojen tekemiseen ja käyttämiseen en osaa antaa, mutta karkean esimerkin voin yrittää esittää.
Yritelmä (C++):
-- luot otsikkotiedoston, jossa kirjastosta löytyvät luokat ja funktiot esitellään
-- luot ohjelmakooditiedoston, jossa luokat ja funktiot toteutetaan
-- käännät tämän dynaamisesti ladattavaksi kirjastoksi (katso kääntäjän ohjeita)
-- luot ohjelma joka käyttää kirjaston otsikkotiedostossa esiteltyjä luokkia/funktioita
-- käännät ohjelman ja linkität dynaamisen kirjaston mukaan (katso kääntäjän ohjeita).
"Mitä *.dll tidosto voi sisältää ja mitä kaikkea siihen voi sisällyttää"
Dll:t voivat sisältää ohjelmakoodia ja resursseja, kuten ääntä, kuvia, ikoneja, tai ihan mitä vain tiedostoja.
Putkasta löytyy myöso pas DLL-tiedostojen luomiseen Visual Basicilla: https://www.ohjelmointiputka.net/oppaat/opas.
Mainitaan nyt vielä Linuxin vastine, eli Linuxissa käytetään .so-tiedostoja, mutta periaate on sama kuin Windowsissa.
Tässä pieni tietopaketti dynaamisesti linkitettävistä kirjastoista.
Dynaamisesti linkitettävien kirjastojen sisältämä koodi ladataan käyttöön vasta, kun ohjelma tarvitsee sitä. Sitä ei siis linkitetä ohjelmaan mukaan toisin kuin staattisesti linkitetävät kirjastot.
Unix-tyylisissä käyttöjärjestelmissä dynaamisesti linkitettävät kirjastot sijaitsevat niille tarkoitetuissa hakemistoissa. Esimerkiksi Linuxeissa nämä hakemistot määritellään /etc/ld.so.conf
-tiedostossa ja LD_LIBRARY_PATH-ympäristömuuttujassa.
Windowsissa dynaamisesti linkitettäviä kirjastoja haetaan siitä hakemistosta, josta ohjelma ladataan, hakemistoista, jotka on asetettu SetDllDirectory-funktiolla, System32-hakemistosta, System-hakemistosta, Windows-hakemistosta ja lopuksi PATH-ympäristömuuttujalla kerrotuista hakemistoista.
Linux, Solaris ja BSD-variantit käyttävät dynaamisesti linkittävien kirjastojen päätteenä .so-päätettä. Kirjaston nimi muodostuu lib-alusta, kirjaston nimestä, .so-päätteestä ja versionumerosta (niinsanottu so-nimi). Esimerkiksi kirjaston omakirjasto version 3 nimi olisi libomakirjasto.so.3
.
Mac OS X käyttää so-tyylisiä kirjastoja, mutta niiden pääte on .dylib. Suurin osa kirjastoista sijoitetaan erilaisiin nippuihin. Nippu voisi olla esimerkiksi "Mun omat kirjastot.framework".
Windows käyttää dynaamisesti linkitettävien kirjastojen päätteenä päätettä dll.
Lähteinä käytetty: http://en.wikipedia.org/wiki/Library_
A-P kirjoitti:
Tässä pieni tietopaketti dynaamisesti linkitettävistä kirjastoista.
Dynaamisesti linkitettävien kirjastojen sisältämä koodi ladataan käyttöön vasta, kun ohjelma tarvitsee sitä. Sitä ei siis linkitetä ohjelmaan mukaan toisin kuin staattisesti linkitetävät kirjastot.
Tarkennus: monet järjestelmät lataavat kirjastot oikeasti ohjelman käynnistyksen yhteydessä, ei vasta kun ohjelma tarvitsee niitä. Esimerkiksi Linuxin linkkeri perinteisesti lataa kaiken kerralla ja esimerkiksi KDE-porukalla on ollut ongelmia tämän kanssa. Windowsissa sen sijaan voidaan ladata siten että oikeasti vasta kun tarvitaan, ladataan. Ja .NETissä tämä on vakiotoimintaa.
Kummassakin on puolensa, toinen hidastaa käynnistystä, toinen saattaa aiheuttaa pieniä viiveitä ohjelman käytön aikana.
Voi Linuxissakin ladata vasta ajon aikana ja vaikka käyttäjän syötteen perusteella valitusta tiedostosta käyttäjän pyytämän funktion. Pääidea lataamisessa on kuitenkin se, että tiettyä osaa voi muuttaa muuttamatta koko ohjelmaa, ja se, että esimerkiksi kirjastoja voi käyttää useampi ohjelma kerralla eikä jokaisen tarvitse sisältää itse samaa koodia, kun se löytyy dynaamisesta kirjastosta.
"Kummassakin on puolensa, toinen hidastaa käynnistystä, toinen saattaa aiheuttaa pieniä viiveitä ohjelman käytön aikana."
Sanoisinko, että tyypillinen DLL:ien käyttötyyli on juuri heti alussa lataaminen. Yleensä DLL:ien käytöllä halutaan lisätä modulaarisuutta ja päivitettävyyttä, mutta dynaaminen DLL:n lataaminen on yleensä ihan turhaa, ja voi aiheuttaa turhaa päänvaivaa.
Yleensä dynaamisesti DLL:iä ladataan silloin, jos ei etukäteen (ohjelman käännöshetkellä) tiedetä mitä DLL:iä ohjelman on tarkoitus ladata. Esimerkiksi lisäkkeiden eli pluginien lataus on tästä oiva esimerkki. Annetaan ohjelmalle polku, ja ohjelma lataa polusta löytyvät sopivat kriteerit täyttävät DLL:t.
Metabolix kirjoitti:
Voi Linuxissakin ladata vasta ajon aikana ja vaikka käyttäjän syötteen perusteella valitusta tiedostosta käyttäjän pyytämän funktion.
Voi, mutta en tarkoittanut sitä että ohjelma itsessään lataa vaan että linkkeri lataa. Windowsissa siis linkataan ihan normaalisti kirjasto softaan mutta linkkeri ei lataa sitä ennen kuin sitä tarvitaan, jos näin halutaan.
Molemmissa voi tehdä tuollaisen "lataapa xyz.dll tuolta ja anna sieltä kamaa" myös mutta siitä ei ollut nyt kyse.
Aihe on jo aika vanha, joten et voi enää vastata siihen.