DLL nedir?

Şunlar için geçerlidir: Yok

Özet


Bu makale, dinamik bağlantı kitaplığının (DLL) ne olduğunu ve DLL kullandığınızda oluşabilecek çeşitli sorunları açıklar.

Ardından bu makale, kendi DLL'lerinizi geliştirirken göz önünde bulundurmanız gereken bazı gelişmiş sorunları açıklar. DLL'nin ne olduğunu açıklarken, bu makalede dinamik bağlama yöntemleri, DLL bağımlılıkları, DLL giriş noktaları, DLL işlevleri dışa aktarma ve DLL sorun giderme araçları açıklanmaktadır.

Bu makale, Microsoft .NET Framework derlemeleri ile DLL'lerin üst düzey bir karşılaştırması ile tamamlanır.

GİRİŞ


"Geçerlidir" bölümünde listelenen Microsoft Windows işletim sistemleri için, işletim sisteminin işlevselliğinin çoğu dinamik bağlantı kitaplıkları (DLL) tarafından sağlanır. Ayrıca, bu Windows işletim sistemlerinden birinde bir program çalıştırdığınızda, programın işlevselliğinin birçoğu DLL'ler tarafından sağlanabilir. Örneğin, bazı programlar birçok farklı modül içerebilir ve programın her modülü DLL'lerde bulunur ve bunlarla dağıtılır.

DLL'lerin kullanımı, kodun modülerleştirilmesini, kodun yeniden kullanılmasını, verimli bellek kullanımını ve disk alanının azaltılmasını desteklemeye yardımcı olur. Bu nedenle, işletim sistemi ve programlar daha hızlı yüklenir, daha hızlı çalışır ve bilgisayarda daha az disk alanı tutar.

Bir program bir DLL kullandığında, bağımlılık olarak adlandırılan bir sorun programın çalışmamasına neden olabilir. Bir program bir DLL kullandığında, bir bağımlılık oluşturulur. Başka bir program bu bağımlılığın üzerine yazar ve bozarsa, asıl program başarıyla çalıştırılamayabilir.

Microsoft .NET Framework'ün piyasaya sürülmesiyle, çoğu bağımlılık sorunu derlemeler kullanılarak ortadan kaldırılmıştır.

Ek Bilgi


DLL nedir?

DLL, aynı anda birden fazla program tarafından kullanılabilen kod ve veri içeren bir kitaplıktır. Örneğin, Windows işletim sistemlerinde, Comdlg32 DLL ortak iletişim kutusuyla ilgili işlevleri gerçekleştirir. Bu nedenle, her program iletişim kutusu uygulamak için bu DLL'de bulunan işlevini kullanabilir. Bu, kodun yeniden kullanımına ve verimli bellek kullanımınına yardımcı olur.

Bir DLL kullanılarak, bir program ayrı bileşenler halinde modüler hale getirilebilir. Örneğin, bir muhasebe programı modülle satılabilir. Bu modül yüklenmiş ise, her bir modül çalışma zamanında ana programda kullanılabilir. Modüller ayrı olduğundan, programın yükleme süresi daha hızlıdır ve bir modül yalnızca bu işlevsellik istendiğinde yüklenir.

Ayrıca, güncelleştirmeleri programın diğer bölümlerini etkilemeden her modüle uygulamak daha kolaydır. Örneğin, bir bordro programınız olabilir ve vergi oranları her yıl değişir. Bu değişiklikler bir DLL'ye yalıtıldığında, tüm programı yeniden oluşturmaya veya yüklemeye gerek kalmadan bir güncelleştirme uygulayabilirsiniz.

Aşağıdaki liste, Windows işletim sistemlerinde DLL olarak uygulanan bazı dosyaları açıklar:
  • ActiveX Denetimleri (.ocx) dosyaları
    ActiveX denetimine bir örnek, takvimden bir tarih seçmenize olanak tanıyan bir takvim denetimidir.
  • Denetim Masası (.cpl) dosyaları
    .cpl dosyasının bir örneği Denetim Masası'nda bulunan bir öğedir. Her öğe özel bir DLL'dir.
  • Aygıt sürücüsü (.drv) dosyaları
    Aygıt sürücüsüne bir örnek, bir yazıcıda yazdırma işlemini kontrol eden bir yazıcı sürücüsüdür.

DLL avantajları

Aşağıdaki liste, bir program DLL kullandığında sağlanan avantajlardan bazılarını açıklar:
  • Daha az kaynak kullanır
    Birden çok program aynı işlev kitaplığını kullandığında, DLL diske ve fiziksel belleğe yüklenen kodun çoğaltılmasını azaltabilir. Bu, sadece ön planda çalışan programın değil, Windows işletim sisteminde çalışan diğer programların da performansını büyük ölçüde etkileyebilir.
  • Modüler mimariyi teşvik eder
    Bir DLL, modüler program geliştirmeye yardımcı olur. Bu, birden çok dil sürümü gerektiren veya modüler mimari gerektiren programlar geliştirmenize yardımcı olur. Modüler bir programa örnek, çalışma zamanında dinamik olarak yüklenebilen birçok modüle sahip bir muhasebe programıdır.
  • Dağıtım ve yüklemeyi kolaylaştırır
    DLL içindeki bir işlevin bir güncelleştirmeye veya düzeltmeye ihtiyacı olduğunda, DLL'nin dağıtımı ve yüklenmesi programın DLL ile yeniden bağlanmasını gerektirmez. Ayrıca, birden çok program aynı DLL kullanıyorsa, birden çok programın tümü güncelleştirmeden veya düzeltmeden yararlanır. Bu sorun, düzenli olarak güncelleştirilen veya düzeltilen üçüncü taraf bir DLL kullandığınızda daha sık oluşabilir.

DLL bağımlılıkları

Bir program veya DLL, başka bir DLL'de bir DLL işlevi kullandığında, bir bağımlılık oluşur. Bu nedenle, program artık kendi kendine yetmez ve bağımlılık bozulursa program sorunlarla karşılaşabilir. Örneğin, aşağıdaki eylemlerden biri oluşursa program çalışmayabilir:
  • Bağımlı bir DLL yeni bir sürüme yükseltildi.
  • Bağımlı bir DLL düzeltildi.
  • Bağımlı bir DLL üzerine önceki bir sürümü yazılmış.
  • Bağımlı bir DLL bilgisayardan kaldırılmış.
Bu eylemler genellikle DLL çatışmaları olarak bilinir. Geriye dönük uyumluluk zorlanmazsa, program başarıyla çalışamayabilir.

Aşağıdaki liste, bağımlılık sorunlarını en aza indirmeye yardımcı olmak için Microsoft Windows 2000'de ve daha sonraki Windows işletim sistemlerinde tanıtılan değişiklikleri açıklar:
  • Windows Dosya Koruması
    Windows Dosya Koruması'nda işletim sistemi, sistem DLL'lerinin yetkisiz bir aracı tarafından güncelleştirilmesini veya silinmesini önler. Bu nedenle, bir program yüklemesi sistem DLL olarak tanımlanan bir DLL'yi kaldırmaya veya güncelleştirmeye çalıştığında, Windows Dosya Koruması geçerli bir dijital imza arar.
  • Özel DLL'ler
    Özel DLL'ler, bir programı paylaşılan DLL'lere yapılan değişikliklerden yalıtmanıza izin verir. Özel DLL'ler, program tarafından kullanılan DLL sürümünü zorlamak için sürüme özgü bilgiler veya boş bir .local dosyası kullanır. Özel DLL'leri kullanmak için DLL'lerinizi program kök klasöründe bulun. Ardından, yeni programlar için DLL'ye sürüme özgü bilgiler ekleyin. Eski programlar için boş bir .local dosyası kullanın. Her yöntem, işletim sistemine program kök klasöründe bulunan özel DLL'leri kullanmasını söyler.

DLL sorun giderme araçları

DLL sorunlarının giderilmesine yardımcı olmak için kullanılabilecek birkaç araç ve yöntem bulunmaktadır Aşağıdaki araçlar bu araçlardan bazılarıdır.

Bağımlılık Yürütücüsü

Bağımlılık Yürütücüsü aracı, bir program tarafından kullanılan tüm bağımlı DLL'leri özyinelemeli olarak tarar. Bağımlılık Yürütücüsü'nde bir program açtığınızda, Bağımlılık Yürütücü aşağıdaki denetimleri gerçekleştirir:
  • Bağımlılık Yürütücüsü eksik DLL'leri denetler.
  • Bağımlılık Yürütücüsü, geçerli olmayan program dosyalarını veya DLL'leri denetler.
  • Bağımlılık Yürütücüsü alma işlevleri ve dışa aktarma işlevlerinin eşleşip eşleşmediğini denetler.
  • Bağımlılık Yürütücüsü döngüsel bağımlılık hatalarını denetler.
  • Bağımlılık Yürütücüsü, farklı bir işletim sistemi için olması nedeniyle geçerli olmayan modülleri denetler.
Bağımlılık Yürütücüsü'nü kullanarak, bir programın kullandığı tüm DLL'leri belgeleyebilirsiniz. Bu, gelecekte oluşabilecek DLL sorunlarını önlemeye ve düzeltmeye yardımcı olabilir. Bağımlılık Yürütücüsü, Microsoft Visual Studio 6.0'ı yüklediğinizde aşağıdaki dizinde bulunur:
sürücü\Program Dosyaları\Microsoft Visual Studio\Ortak\Araçlar

DLL Evrensel Sorun Çözücü

DLL Evrensel Sorun Çözücü (DUPS) aracı, DLL bilgilerini denetlemek, karşılaştırmak, belgelemek ve görüntülemek için kullanılır. Aşağıdaki liste, DUPS aracını oluşturan yardımcı programları açıklar:
  • Dlister.exe
    Bu yardımcı program bilgisayardaki tüm DLL'leri kaydeder ve bilgileri bir metin veya veritabanı dosyasına kaydeder.
  • Dcomp.exe
    Bu yardımcı program, iki metin dosyasında listelenen DLL'leri karşılaştırır ve farklılıkları içeren üçüncü bir metin dosyası üretir.
  • Dtxt2DB.exe
    Bu yardımcı program dllHell veritabanına Dlister.exe yardımcı programı ve Dcomp.exe yardımcı programı kullanılarak oluşturulan metin dosyalarını yükler.
  • DlgDtxt2DB.exe
    Bu yardımcı program Dtxt2DB.exe yardımcı programına bir grafik kullanıcı arabirimi (GUI) sürümü sağlar.
DUPS aracı hakkında daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklayın:
247957 DLL uyumluluk sorunlarını çözmek için DUPS.exe kullanma
 

DLL Yardım veritabanı

DLL Yardım veritabanı, Microsoft yazılım ürünleri tarafından yüklenen DLL'lerin belirli sürümlerini bulmanıza yardımcı olur. 

DLL geliştirme

Bu bölümde, kendi DLL'lerinizi geliştirirken göz önünde bulundurmanız gereken sorunlar ve gereksinimler açıklanmaktadır.

DLL türleri

Bir uygulamada bir DLL yüklediğinizde, dışa aktarılan DLL işlevlerini aramanıza izin vermek için iki bağlama yöntemi vardır. Bağlamanın iki yöntemi, yükleme zamanı dinamik bağlama ve çalışma zamanı dinamik bağlamadır.
Yükleme süresi dinamik bağlantı
Yükleme süresi dinamik bağlamada, bir uygulama yerel işlevler gibi dışa aktarılan DLL işlevlerine açık çağrılar yapar. Yükleme zamanı dinamik bağlamayı kullanmak için, uygulamayı derleyip bağladığınızda bir üstbilgi (.h) dosyası ve alma kitaplığı (.lib) dosyası sağlayın. Bunu yaptığınızda, bağlayıcı sisteme DLL'yi yüklemek ve dışa aktarılan DLL işlev konumlarını yükleme zamanında çözmek için gereken bilgileri sağlar.
Çalışma zamanı dinamik bağlantı
Çalışma zamanı dinamik bağlamada, bir uygulama DLL'yi çalışma zamanında yüklemek için LoadLibrary işlevini veya LoadLibraryEx işlevini çağırır. DLL başarıyla yüklendikten sonra, aramak istediğiniz dışa aktarılan DLL işlevinin adresini almak için GetProcAddress işlevi kullanılır. Çalışma zamanı dinamik bağlama kullandığınızda, bir alma kitaplığı dosyası gerekmez.

Aşağıdaki liste, yükleme zamanı dinamik bağlamanın ne zaman kullanılacağı ve çalışma zamanı dinamik bağlamanın ne zaman kullanılacağına yönelik uygulama ölçütlerini açıklar:
  • Başlangıç performansı
    Uygulamanın ilk başlangıç performansı önemliyse, çalışma süresi dinamik bağlaması kullanmalısınız.
  • Kullanım kolaylığı
    Yükleme süresi dinamik bağlamada, dışa aktarılan DLL işlevleri yerel işlevler gibidir. Böylece bu işlevleri aramanız kolaylaşır.
  • Uygulama mantığı
    Çalışma zamanı dinamik bağlamada, gerektiğinde bir uygulama farklı modülleri yüklemek için dal olabilir. Bu, çok dilli sürümler geliştirdiğinizde önemlidir.

DLL giriş noktası

Bir DLL oluşturduğunuzda, isteğe bağlı olarak bir giriş noktası işlevi belirtebilirsiniz. İşlemler veya iş parçacıkları kendilerini DLL'ye iliştirdiğinde veya DLL'den ayrıldığında giriş noktası işlevi çağrılır. Veri yapılarını başlatma veya DLL'nin gerektirdiği veri yapılarını yok etmek için giriş noktası işlevini kullanabilirsiniz. Ayrıca, uygulama çok iş parçacığıyla ilgiliyse, giriş noktası işlevindeki her iş parçacığına özel bellek ayırmak için iş parçacığı yerel depolama (TLS) kullanabilirsiniz. Aşağıdaki kod DLL giriş noktası işlevinin bir örneğidir.
BOOL APIENTRY DllMain(HANDLE hModule,// Handle to DLL moduleDWORD ul_reason_for_call,// Reason for calling functionLPVOID lpReserved ) // Reserved{switch ( ul_reason_for_call ){case DLL_PROCESS_ATTACHED:// A process is loading the DLL.break;case DLL_THREAD_ATTACHED:// A process is creating a new thread.break;case DLL_THREAD_DETACH:// A thread exits normally.break;case DLL_PROCESS_DETACH:// A process unloads the DLL.break;}return TRUE;}
Giriş noktası işlevi FALSE değeri döndürdüğünde, yükleme süresi dinamik bağlama kullanıyorsanız uygulama başlamaz. Çalışma süresi dinamik bağlama kullanıyorsanız, yalnızca tek tek DLL yüklenemez.

Giriş noktası işlevi yalnızca basit başlatma görevleri gerçekleştirmeli ve başka bir DLL yükleme veya sonlandırma işlevi çağırmamalıdır. Örneğin, giriş noktası işlevinde LoadLibrary işlevini veya LoadLibraryEx işlevini doğrudan veya dolaylı olarak aramamalısınız. Ayrıca, işlem sona ererken FreeLibrary işlevini çağırmamalısınız.

Not Çok iş parçacıklı uygulamalarda, olası veri bozulmasını önlemek için DLL global verilerine erişimin senkronize olduğundan (iş parçacığı güvenli) emin olun. Bunu yapmak için, her iş parçacığına benzersiz veri sağlamak amacıyla TLS kullanın.

DLL işlevlerini dışa aktarma

DLL işlevlerini dışa aktarmak için, dışa aktarılan DLL işlevlerine bir işlev anahtar sözcüğü ekleyebilir veya dışa aktarılan DLL işlevlerini listeleyen bir modül tanımı (.def) dosyası oluşturabilirsiniz.

Bir işlev anahtar sözcüğü kullanmak için, dışa aktarmak istediğiniz her işlevi aşağıdaki anahtar kelimeyle bildirmeniz gerekir:
__declspec(dllexport)
Uygulamada dışa aktarılan DLL işlevlerini kullanmak için, almak istediğiniz her işlevi aşağıdaki anahtar kelimeyle bildirmeniz gerekir:
__declspec(dllimport)
Genellikle, alma ve dışarı aktarma deyimlerini ayırmak için define ve ifdef deyimleri olan bir üstbilgi dosyası kullanılır.

Dışa aktarılan DLL işlevlerini bildirmek için bir modül tanım dosyası da kullanabilirsiniz. Bir modül tanım dosyası kullandığınızda, dışa aktarılan DLL işlevlerine işlev anahtar sözcüğü eklemeniz gerekmez. Modül tanım dosyasında, KÜTÜPHANE deyimini ve DIŞA AKTARIMLAR deyimini açıklarsınız. Aşağıdaki kod, bir dosya tanımı örneğidir.
// SampleDLL.def//LIBRARY "sampleDLL"EXPORTS  HelloWorld

Örnek DLL ve uygulama

Microsoft Visual C++ 6.0'da Win32 Dinamik link Kütüphanesi proje türünü veya
MFC AppWizard (dll) proje türünü seçerek bir DLL oluşturabilirsiniz.

Aşağıdaki kod, Visual C++'da
Win32 Dinamik Bağlantı Kitaplığı proje türü kullanılarak oluşturulmuş bir DLL örneğidir.
// SampleDLL.cpp//#include "stdafx.h"#define EXPORTING_DLL#include "sampleDLL.h"BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved ){    return TRUE;}void HelloWorld(){MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);}
// File: SampleDLL.h//#ifndef INDLL_H#define INDLL_H#ifdef EXPORTING_DLLextern __declspec(dllexport) void HelloWorld() ;#elseextern __declspec(dllimport) void HelloWorld() ;#endif#endif
Aşağıdaki kod, SampleDLL DLL'de dışa aktarılan DLL işlevini çağıran Win32 Uygulaması projesi örneğidir.
// SampleApp.cpp //#include "stdafx.h"#include "sampleDLL.h"int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR     lpCmdLine,                     int       nCmdShow){ HelloWorld();return 0;}
NotYükleme süresi dinamik bağlamada, SampleDLL projesini oluştururken oluşturulan SampleDLL.lib alma kitaplığını bağlamanız gerekir.

Çalışma süresi dinamik bağlamada, SampleDLL.dll dışa aktarılan DLL işlevini aramak için aşağıdaki koda benzer kod kullanılır.
...typedef VOID (*DLLPROC) (LPTSTR);...HINSTANCE hinstDLL;DLLPROC HelloWorld;BOOL fFreeDLL;hinstDLL = LoadLibrary("sampleDLL.dll");if (hinstDLL != NULL){    HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");    if (HelloWorld != NULL)        (HelloWorld);    fFreeDLL = FreeLibrary(hinstDLL);}...
SampleDLL uygulamasını derleyip bağladığınızda, Windows işletim sistemi sampleDLL DLL'yi aşağıdaki konumlarda şu sırayla arar:
  1. Uygulama klasörü
  2. Geçerli klasör
  3. Windows sistem klasörü

    Not GetSystemDirectory işlevi Windows sistem klasörünün yolunu döndürür.
  4. Windows klasörü

    Not GetWindowsDirectory işlevi Windows klasörünün yolunu döndürür.

.NET Framework derlemesi

Microsoft .NET ve .NET Framework'ün piyasaya sürülmesiyle, DLL'lerle ilişkili sorunların çoğu derlemeler kullanılarak ortadan kaldırıldı. Derleme, .NET ortak dil çalışma zamanı (CLR) denetimi altında çalışan mantıksal bir işlevsellik birimidir. Derleme fiziksel olarak .dll dosyası veya .exe dosyası olarak bulunur. Ancak, dahili olarak bir derleme Microsoft Win32 DLL'den çok farklıdır.

Derleme dosyası bir derleme bildirimi, tür meta verisi, Microsoft ara dili (MSIL) kodu ve diğer kaynakları içerir. Derleme bildirimi, bir derlemenin kendi kendini tanımlaması için gereken tüm bilgileri sağlayan derleme meta verilerini içerir. Aşağıdaki bilgiler derleme manifestosunda yer alan bilgilerdir:
  • Derleme adı
  • Sürüm bilgileri
  • Kültür bilgileri
  • Güçlü ad bilgileri
  • Dosyaların derleme listesi
  • Tür başvuru bilgileri
  • Başvurulan ve bağımlı derleme bilgileri
Derlemede bulunan MSIL kodu doğrudan yürütülemez. Bunun yerine, MSIL kod yürütme CLR üzerinden yönetilir. Varsayılan olarak, bir derleme oluşturduğunuzda, derleme uygulamaya özeldir. Paylaşılan bir derleme oluşturmak için derlemeye güçlü bir ad atamanız ve derlemeyi genel derleme önbelleğinde yayımlamanız gerekir.

Aşağıdaki liste, Win32 DLL'lerinin özellikleri ile kıyasla derlemelerin bazı özelliklerini açıklar:
  • Kendini tanımlayan
    Bir derleme oluşturduğunuzda, CLR'nin derlemeyi çalıştırması için gereken tüm bilgiler derleme bildiriminde bulunur. Derleme bildirimi bağımlı derlemelerin bir listesini içerir. Bu nedenle, CLR uygulamada kullanılan tutarlı bir dizi derlemeleri koruyabilir. Win32 DLL'lerde, paylaşılan DLL'leri kullandığınızda bir uygulamada kullanılan bir dizi DLL arasında tutarlılık sağlayamazsınız.
  • Sürüm belirleme
    Bir derleme bildiriminde, sürüm bilgileri CLR tarafından kaydedilir ve uygulanır. Ayrıca, sürüm ilkeleri, sürüme özgü kullanımı zorlamanıza izin verebilir. Win32 DLL'lerde sürüm belirleme, işletim sistemi tarafından uygulanamaz. Bunun yerine, DLL'lerin geriye dönük uyumlu olduğundan emin olmalısınız.
  • Yan yana dağıtım
    Derlemeler yan yana dağıtımı destekler. Bir uygulama derlemenin bir sürümünü kullanabilir ve başka bir uygulama derlemenin farklı bir sürümünü kullanabilir. Windows 2000'den başlayarak, yan yana dağıtım, uygulama klasöründeki DLL'lerin bulunmasıyla desteklenir. Ayrıca, Windows Dosya Koruması, sistem DLL'lerinin üzerine yazılmasını veya yetkisiz bir aracı tarafından değiştirilmesini önler.
  • Kendi kendini koruma ve yalıtım
    Bir derleme kullanılarak geliştirilen bir uygulama, bilgisayarda çalışan diğer uygulamalardan bağımsız ve yalıtılmış olabilir. Bu özellik, sıfır etkili yüklemeler oluşturmanıza yardımcı olur.
  • Yürütme
    Derleme, derleme bildiriminde verilen ve CLR tarafından denetlenen güvenlik izinleri altında çalıştırılır.
  • Dilden bağımsız
    Desteklenen .NET dillerinden herhangi biri kullanılarak bir derleme geliştirilebilir. Örneğin, Microsoft Visual C#'de bir derleme geliştirebilir ve derlemeyi bir Microsoft Visual Basic.NET projesinde kullanabilirsiniz.