Microsoft Windows işletim "Aşağıdakilere Uygulanır" bölümünde listelenen sistemleri için işletim sistemi işlevselliğinin çoğunu dinamik bağlantı kitaplıkları (DLL) tarafından sağlanır. Bu <a0>Windows</a0> işletim sistemlerinden birinde bir programı çalıştırdığınızda, ayrıca, çoğu program işlevselliğini DLL tarafından sağlanabilir. Örneğin, bazı programlar, birçok farklı modülleri içerebilir ve modüllerin programın bulunan ve DLL içinde dağıtılmış.
Dll kullanımını modularization kodu, kodu yeniden kullanma, etkin bir bellek kullanımı yükseltmek yardımcı olur ve disk alanı sınırlı. Bu nedenle, işletim sistemini ve programları daha hızlı yüklenir, daha hızlı çalışmasını ve bilgisayar üzerinde daha az disk alanı olması.
Bir programı, bir DLL kullandığında, bağımlılık adlı bir sorun yok çalıştırılacak programın neden olabilir. Bir programı, bir DLL kullandığında, bir bağımlılık oluşturulur. Başka bir program üzerine yazar ve bu bağımlılık keser, özgün programın başarılı bir şekilde çalışmayabilir.
Microsoft .NET Framework'ün giriş ile bağımlılık sorunlarının çoğu derlemeler kullanarak elemiş.
DLL nedir?
Kod ve aynı anda birden fazla program tarafından kullanılan veri içeren bir kitaplık dll'dir. Örneğin, Windows işletim sistemlerinde, Comdlg32 DLL ortak gerçekleştiren işlevler kutusu ilgili. Bu nedenle, her program, açık
bir iletişim kutusu uygulamak için bu DLL bulunan işlevleri kullanabilirsiniz. Bu, kodu yeniden kullanma ve etkin bir bellek kullanımı yükseltmek yardımcı olur.
Bir DLL DOSYASı'nı kullanarak, bir programın ayrı bileşenlerine modularized olabilir. Örneğin, bir muhasebe programını modülü tarafından satılacak. Bu modül yüklü değilse, her modülün zamanında ana programa yüklenebilir. Modülleri ayrı olduğundan, programın yükleme süresi daha hızlıdır ve bu işlevselliği istenen bir modüle yalnızca yüklenir.
Ayrıca, güncelleştirmeleri programın diğer bölümlerini etkilemeden, her modül için geçerli kolaydır. Örneğin, Bordro bir program olabilir ve her yıl vergisi oranları değiştirme. Bu değişiklikleri bir DLL için yalıtılmış olduğunda, bir güncelleştirme oluşturmak veya tüm programı yüklemeyi yeniden uygulayabilirsiniz.
Aşağıdaki listede, dll, Windows işletim sistemlerinde uygulanan dosyaların bazıları açıklanmaktadır:
- ActiveX denetimleri (.ocx) dosyaları
Bir ActiveX denetimi sağlayan bir takvimden bir tarih seçin, bir takvim denetiminin örneğidir.
- Denetim Masası (.cpl) dosyaları
Denetim Masası'nda bulunan bir maddeyi bir .cpl dosyasının örnektir. Her maddenin özel bir dll'dir.
- Aygıt sürücüsü (.drv) dosyaları
Bir aygıt sürücüsü bir yazıcıda yazdırmayı denetleyen bir yazıcı sürücüsü örneğidir.
DLL yararları
Aşağıdaki liste, bir programı, bir DLL kullandığında, sağlanan yararlarından bazılarını açıklar:
- Daha az kaynak kullanır.
Birden çok program aynı kitaplığı işlevlerini kullandığınızda, bir DLL çoğaltmaya, disk ve fiziksel bellekte yüklü kod azaltabilirsiniz. Bu ön planda çalışan program değil, aynı zamanda Windows işletim sistemi üzerinde çalışan diğer programların performansını önemli ölçüde etkileyebilir.
- Promotes modüler mimarisi
Bir DLL DOSYASı, modüler programlar geliştirme yükseltmek yardımcı olur. Bu, birden çok dil sürümü, büyük bir program veya modüler mimarisi gerektiren bir programı geliştirmenize yardımcı olur. Modüler bir programın çalışma anında dinamik olarak yüklenebilecek çoğu modülleri olan bir muhasebe programını örneğidir.
- Hareket hızı dağıtım ve yükleme
Içinde bir DLL işlevi, bir güncelleştirme veya düzeltme gerektiğinde, DLL yüklenmesi ve dağıtımı gerektirmez DLL ile yeniden programın. Birden çok program aynı DLL kullanırsanız, ayrıca, birden çok program tüm güncelleştirme veya düzeltme yararlanacaktır. Düzenli olarak güncelleştirilen sabit veya bir üçüncü taraf dll DOSYASıNı kullandığınızda bu sorun daha sık oluşabilir.
DLL bağımlılığı
Bir DLL işlevi, bir program ya da bir DLL başka bir DLL kullandığında, bir bağımlılık oluşturulur. Bu nedenle, artık kendi içinde bütünlük oluşturan programdır ve bağımlılık başarısız olması durumunda, program sorunlarla karşılaşabilirsiniz. Örneğin, aşağıdaki eylemlerden biri oluşursa, program çalışmayabilir:
- Bağımlı BIR DLL DOSYASı, yeni bir sürüme yükseltilir.
- Bağımlı bir DLL giderilmiştir.
- Bağımlı BIR DLL DOSYASı, önceki bir sürümüyle üzerine yazılır.
- Bağımlı BIR DLL DOSYASıNı bilgisayarınızdan kaldırılır.
Bu eylemleri genellikle DLL çakışmaları da bilinir. Program uyumluluk uygulanır, başarılı bir şekilde çalışmayabilir.
Aşağıdaki liste, Microsoft Windows 2000 ve sonraki Windows işletim sistemlerindeki bağımlılık sorunları en aza indirmek için sunulan değişiklikler açıklanır:
- Windows Dosya Koruması
Windows Dosya Koruması, işletim sistemi, <a1>Sistem</a1> güncelleştirildi veya yetkisiz bir aracı tarafından silinmiş dll engeller. Bu nedenle, bir program yükleme, sistem DLL DOSYASı tanımlanmış bir DLL güncelleştirmek veya kaldırmak çalıştığında, Windows Dosya Koruması için geçerli bir dijital imza arayacaktır.
- Özel DLL'ler
Özel DLL'ler sağlar, paylaşılan dll. özel dll dosyalarına yapılan değişiklikler program yalıtmak sürüme özgü bilgileri veya boş .local dosyası, program tarafından kullanılan DLL sürümü zorlamak için kullanın. Özel DLL'ler kullanmak için <a0></a0>, program kök klasörde, dll dosyalarını bulun. Sonra yeni programlar için DLL'sürümüne özgü bilgiler ekleyin. Eski programlar için bir boş .local dosyası kullanın. Her yöntemin program kök klasörde bulunan bir özel DLL'ler kullanmak istediğiniz işletim sistemini belirtir.
DLL sorun giderme araçları
DLL sorunlarını gidermenize yardımcı olacak çeşitli araçlar kullanılabilir. Aşağıdaki araçlar, bu araçları birkaçıdır.
Bağımlılık Walker
Bağımlılık Walker aracı için bir program tarafından kullanılan tüm bağımlı DLL'lerin özyinelemeli olarak tarama olabilir. Bağımlılık Walker bir programı açtığınızda, bağımlılık Walker aşağıdaki gerçekleştirmez:
- Bağımlılık Walker DLL eksik olup olmadığını denetler.
- Bağımlılık Walker program dosyalarını veya DLL geçersiz denetler.
- Bağımlılık Walker işlevleri almak ve işlevleri eşleşmesi verme denetler.
- Bağımlılık Walker döngüsel bağımlılık hatalara karşı denetler.
- Bağımlılık Walker modülleri için farklı bir işletim sistemi olduğundan, geçerli olmayan bir modülü olup olmadığını denetler.
Bağımlılık Walker kullanarak, bir programın kullandığı tüm dll dosyaları belge. Bu, engelleme ve ileride ortaya çıkabilecek DLL sorunları gidermesi yardımcı olabilir. Microsoft Visual Studio 6.0 yüklediğinizde bağımlılık Walker aşağıdaki dizinde bulunur:
drive\Program Files\Microsoft visual Studio\Common\Tools
Evrensel sorun Çözücü DLL
DLL Evrensel sorun Çözücü (DUPS) aracı, denetlemek için belgeyi karşılaştırmak ve DLL bilgilerini görüntülemek için kullanılır. Aşağıdaki listede DUPS aracı, yardımcı programlar açıklanmıştır:
- Dlister.exe
Bu yardımcı program, bilgisayardaki tüm dll numaralandırır ve bilgileri bir metin dosyasına veya bir veritabanı dosyasına kaydeder.
- Dcomp.exe
Bu yardımcı program, iki metin dosyalarında listelenen dll karşılaştırır ve farkları içeren üçüncü bir metin dosyası oluşturur.
- Dtxt2DB.exe
Bu yardımcı programı Dlister.exe yardımcı programı'nı ve dllHell veritabanına Dcomp.exe yardımcı programı'nı kullanarak oluşturduğunuz metin dosyalarını yükler.
- DlgDtxt2DB.exe
Bu yardımcı program Dtxt2DB.exe yardımcı programının bir grafik kullanıcı arabirimi (GUI) sürümünü sağlar.
DUPS aracı hakkında daha fazla bilgi için Microsoft Knowledge Base'deki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
247957
DUPS.exe DLL uyumluluk sorunlarını gidermek için kullanma
Veritabanı DLL Yardımı
DLL Yardım veritabanı Microsoft yazılım ürünlerinde tarafından yüklenen DLL'leri belirli sürümlerinde bulmanıza yardımcı olur. DLL Yardım veritabanı hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:
DLL geliştirme
Bu bölüm, sorunları ve kendi dll geliştirirken, göz önüne alınması gereken gereksinimleri açıklanır.
Dll türleri
Bir uygulama için genel olarak bildirilen bir DLL DOSYASı yüklenemedi, verilen DLL işlevlerini çağıran bağlama için iki yöntem sağlar. Bağlama, için iki yükleme zamanı dinamik bağlama ve çalıştırma, dinamik bağlama yöntemlerdir.
Yükleme zamanı dinamik bağlama
Yükleme zamanı dinamik bağlama bir uygulamanın açık gibi yerel işlevleri için verilen DLL işlevlerin çağrılar. Yükleme zamanı dinamik bağlama kullanmak için <a0></a0>, <a1>Üstbilgi</a1> (.h) dosyası ve bir <a0>Al</a0> <a1>Kitaplık</a1> (.lib) dosyasını derleyin ve uygulama bağlantı sağlar. Bunu yaptığınızda, the linker sistem DLL yüklenemedi ve verilen bir DLL işlevi konumları yük anda çözmek için gereken bilgileri sağlar.
Çalışma zamanı dinamik bağlama
Çalışma zamanı dinamik bağlama bir uygulama LoadLibrary
işlevini veya zamanında DLL yüklenemedi LoadLibraryEx
işlevini çağırır. DLL başarıyla yüklendikten sonra aramak istediğiniz verilen DLL işlevinin adresini almak için GetProcAddress
işlevini kullanın. Çalışma zamanı dinamik bağlama kullandığınızda, bir <a0>alma</a0> kitaplık dosyası gerekmez.
Aşağıdaki liste, yükleme zamanı dinamik bağlama kullanın ve çalışma zamanı dinamik bağlama kullanıldığı durumlar için uygulama ölçütleri açıklanmaktadır:
- Başlangıç performansı
Uygulama ilk başlatma performansını önemli ise, çalışma zamanı dinamik bağlama kullanmanız gerekir.
- Kullanımı kolay
Yükleme zamanı dinamik bağlama verilen DLL işlevleri gibi yerel işlevleri var. Bu, bu işlevleri çağırmak için kolaylaştırır.
- Bir uygulama mantığı
Çalışma zamanı dinamik bağlama bir uygulamanın gerektiği gibi farklı modülü yüklenemedi dallan. Birden çok dil sürümleri geliştirdiğinizde, bu önemlidir.
DLL giriş noktası
Bir DLL DOSYASı oluşturun, isteğe bağlı olarak bir giriş noktası işlevini belirtebilirsiniz. Giriş noktası işlevini, işlemler veya iş parçacığı yayılmak için DLL denir veya kendilerini DLL dosyasından ilişkisi kesildi. Veri yapıları başlatılamıyor veya DLL gerektirdiği gibi veri yapılarını yıkmak için giriş noktası işlevini kullanabilirsiniz. Ayrıca, uygulama birden çok iş parçacığı, özel bir giriş noktası işlevini her iş parçacığı için bellek ayrılamadı iş parçacığı yerel depolama (TLS) kullanabilirsiniz. Aşağıdaki kod, DLL giriş noktası işlevini örneğidir.
BOOL APIENTRY DllMain(HANDLE hModule, // Handle to DLL module DWORD ul_reason_for_call, // Reason for calling function LPVOID 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şlevini YANLıŞ
bir değer döndürür, yükleme zamanı dinamik bağlama kullanıyorsanız, uygulama başlamaz. Çalıştırma dinamik bağlama kullanıyorsanız, yalnızca tek tek DLL yüklenemiyor.
Giriş noktası işlevini, yalnızca basit başlatma görevleri gerçekleştirmelisiniz ve başka bir DLL yükleniyor veya sona erdirme işlevi çağırmalıdır. Örneğin, giriş noktası işlevini, doğrudan veya dolaylı olarak LoadLibrary
işlevini veya LoadLibraryEx
işlevini çağırmalısınız değil. Işlem sonlandırılıyor, ayrıca, FreeLibrary
işlevi çağırmalıdır değil.Not
Çok iş parçacıklı uygulamalarda erişimin emin DLL'genel veriler eşitlenir (olası veri bozulmasını önlemek için iş parçacığı güvenli). Bunu yapmak için <a0></a0>, her iş parçacığı için benzersiz veri sağlamak için TLS kullanın.
DLL işlevi verme
DLL işlevleri vermek için <a0></a0>, ekleyebilir ya da işlev anahtar sözcük için verilen DLL işlevlerin veya verilen DLL fonksiyonlarını listeler modülünün bir <a1>tanım</a1> (.def) dosyası oluşturun.
Bir işlev anahtar kullanmak için aşağıdaki anahtar sözcüğü ile vermek istediğiniz her bir işlevin bildirmelidir:
__declspec(dllexport)
Verilen bir DLL işlevi uygulamada kullanmak için aşağıdaki anahtar sözcüğüyle almak istediğiniz her bir işlevin bildirmelidir:
__declspec(DllImport)
Tipik olarak tanımlayan
bir ifade ve <a2>verme deyimi ayırmak için bir ifdef
deyimi</a2> ve <a4>alma deyimi içeren bir üstbilgi dosyası kullanabilirsiniz.
Bir <a0>modülü</a0> tanım dosyası, verilen bir DLL işlevi bildirmek için de kullanabilirsiniz. Bir <a0>modülü</a0> tanım dosyası'nı kullandığınızda verilen DLL işlevlere işlevi anahtar sözcük eklemek gerekmez. Modül tanım dosyasında, KITAPLıK
deyimi ve EXPORTS
deyimi için DLL bildirir. Aşağıdaki kod, bir tanım dosyası bir örnektir.
// SampleDLL.def//LIBRARY "sampleDLL"EXPORTS HelloWorld
Örnek bir DLL ve uygulama
Microsoft Visual C++ 6.0 veya Dinamik bağlantı kitaplığı Win32
proje tipi, hem de MFC AppWizard (dll)
</a0> proje tipini seçerek bir DLL DOSYASı oluşturabilirsiniz.
Aşağıdaki kodu, Win32 dinamik bağlantı kitaplığı
</a0> proje tipini kullanarak, Visual C++ ile oluşturulan bir DLL DOSYASı ö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 kodu bir Win32 uygulaması
projenin SampleDLL DLL'DE verilen DLL işlevi çağıran bir örnektir.
Not
// SampleApp.cpp //#include "stdafx.h"#include "sampleDLL.h"int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ HelloWorld(); return 0;}
SampleDLL.lib bağlamalıdırlar yükleme zamanı dinamik bağlama alma kitaplığı, SampleDLL oluşturduğunuzda, oluşturulan proje.
Çalışma zamanı dinamik bağlama aşağıdakine benzer bir kod kullanın SampleDLL.dll çağırmak için kod DLL işlevi dışa.
...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);}...
Derleme ve SampleDLL uygulama bağlama, işletim sistemi Windows SampleDLL DLL aşağıdaki konumlarda sırayla arar:
- Uygulama klasör
- Geçerli klasör
- Windows sistem klasörü
NotGetSystemDirectory işlevi <a0>Windows</a0> sistem klasörünün yolunu verir.
- Windows klasörü
NotGetWindowsDirectory işlevi <a0>Windows</a0> klasörünün yolunu verir.
.NET Framework derlemesini
Microsoft .NET ve .NET Framework ile giriş, dll ile ilişkili sorunların çoğunu derlemeler kullanarak elemiş. Derleme .NET ortak dil çalışma zamanı (CLR) denetimi altında çalışan bir işlev mantıksal birimidir. Derleme, fiziksel olarak bir .dll dosyası veya bir .exe dosyası bulunmaktadır. Ancak, dahili bir derleme bir Microsoft Win32 DLL ' çok farklıdır.
Bir birleştirme dosyası bir derleme bildirimi türü meta verileri, Microsoft ara dili (MSIL) kodunu ve diğer kaynakları içerir. Derleme bildirimi self-describing olacak şekilde bir montaj için gereken tüm bilgileri sağlayan derlemesinin meta verileri içerir. Derleme bildiriminde, aşağıdaki bilgiler yer alır:
- Derleme adı
- Sürüm bilgileri
- Kültür bilgileri
- Kesin ad bilgisi
- Dosyaları birleştirme listesi
- Başvuru bilgisi türü
- Başvurulan ve bağımlı derleme bilgileri
Derlemede bulunan MSIL kodunu doğrudan çalıştırılamaz. Bunun yerine, MSIL kod yürütülmesine CLR'YE yönetilir. Varsayılan olarak, derleme oluşturduğunuzda derleme uygulamaya özeldir. Paylaşılan bir derleme için derleme kesin adı atayın ve sonra da derleme genel derleme önbelleğinde yayımlamak gerektirir.
Aşağıdaki liste, bazı derlemeler için Win32 DLL özelliklerini karşılaştırıldığında özelliklerini açıklar:
- Self-describing
Bir birleştirme oluşturduğunuzda, için CLR derlemesi çalıştırmak gereken tüm bilgileri derleme bildiriminde bulunur. Derleme bildirimi, bağımlı derlemelerin listesini içerir. Bu nedenle, CLR tutarlı bir uygulamada kullanılan derlemeleri sağlayabilirsiniz. Win32 DLL dosyaları, paylaşılan dll'i kullandığınızda, uygulamada kullanılan bir DLL kümesi arasında tutarlılığı korumak edemiyor.
- Sürüm oluşturma
Derleme bildiriminde, sürüm bilgileri kaydedilir ve CLR tarafından zorlanan. Ayrıca, sürüm ilkeleri sürüme özgü kullanımını zorunlu sağlar. Win32 DLL dosyaları sürüm işletim sistemi tarafından zorunlu edemiyor. Bunun yerine, dll geriye dönük olarak uyumlu olduğundan emin olmanız gerekir.
- Yan yana dağıtım
Birleştirmeler, yan yana dağıtım destekler. Bir uygulama, bir derlemenin bir sürümünü kullanabilir ve başka bir uygulama bir derleme farklı bir sürümünü kullanabilirsiniz. Windows 2000'de başlayarak, yan yana dağıtım DLL'ler uygulama klasöründe bulma tarafından desteklenir. Ayrıca, Windows Dosya Koruması sistemi üzerine veya yetkisiz bir aracı tarafından değiştirilen dll önler.
- Self-containment ve ayırma
Derleme kullanılarak geliştirilen bir uygulama, kendi içinde bütünlük oluşturan ve bilgisayarda çalışan diğer uygulamalardan ayrı olabilir. Bu özelliği, sıfır etkisi yüklemelerinin oluşturmanıza yardımcı olur.
- Yürütme
Bir derlemenin derleme bildiriminde sağlanan ve CLR tarafından denetlenen güvenlik izinlerinin altında çalıştırılır.
- Bağımsız bir dil
Derleme .NET desteklenen dillerin herhangi birini kullanarak geliştirilebilir. Örneğin, derleme içinde Microsoft Visual C# geliştirmek ve sonra derleme bir Microsoft Visual Basic. NET'te kullanabilirsiniz proje.