DLL dosyaları tam olarak nedir ve nasıl çalışır?


224

DLL dosyaları tam olarak nasıl çalışır? Çok fazla var gibi görünüyor, ama ne olduklarını veya nasıl çalıştıklarını bilmiyorum.

Peki, onlarla olan anlaşma nedir?


6
Bu sadece Windows ile etiketlendiğinden ve bu soru 2008'de geri yazıldığından, günümüzde dll'nin .NET Core ile de Mac ve Linux'ta çalıştığından bahsetmeye değer.
Jim Aho

Yanıtlar:


288

DLL nedir?

Dinamik Bağlantı Kitaplıkları (DLL) EXE'ler gibidir ancak doğrudan çalıştırılamazlar. Linux / Unix'teki .so dosyalarına benzerler. Yani DLL'ler MS'in paylaşılan kütüphaneleri uygulamasıdır.

DLL'ler bir EXE'e çok benzer, dosya formatının kendisi aynıdır. Hem EXE hem de DLL dosyaları, Taşınabilir Yürütülebilir (PE) dosya biçimini temel alır. DLL dosyaları ayrıca COM bileşenleri ve .NET kitaplıkları içerebilir.

Bir DLL ne içerir?

Bir DLL, bir EXE veya diğer DLL'nin kullandığı işlevler, sınıflar, değişkenler, kullanıcı arabirimleri ve kaynaklar (simgeler, resimler, dosyalar, ... gibi) içerir.

Kütüphane türleri:

Neredeyse tüm işletim sistemlerinde 2 tür kütüphane vardır. Statik kütüphaneler ve dinamik kütüphaneler. Windows'da dosya uzantıları aşağıdaki gibidir: Statik kütüphaneler (.lib) ve dinamik kütüphaneler (.dll). Temel fark, statik kütüphanelerin derleme zamanında çalıştırılabilir dosyaya bağlanmasıdır; dinamik bağlantılı kütüphaneler çalışma zamanına kadar bağlı değildir.

Statik ve dinamik kütüphaneler hakkında daha fazla bilgi:

Statik kitaplık doğrudan bir modülün (EXE veya DLL) içine gömülü olduğundan, normalde bilgisayarınızda olsa da statik kitaplıkları görmezsiniz. Dinamik kütüphane tek başına bir dosyadır.

Bir DLL herhangi bir zamanda değiştirilebilir ve yalnızca bir EXE açıkça DLL'yi yüklediğinde çalışma zamanında yüklenir. Statik kitaplık EXE içinde derlendikten sonra değiştirilemez. Bir DLL EXE kendisini güncelleştirmeden ayrı ayrı güncelleştirilebilir.

DLL yükleme:

Bir program başlangıçta, Win32 API LoadLibrary aracılığıyla veya başka bir DLL'nin bağımlılığı olduğunda bir DLL yükler. Bir program bir işlevi yüklemek için GetProcAddress'i veya bir kaynağı yüklemek için LoadResource'u kullanır.

Daha fazla okuma:

Daha fazla bilgi için lütfen MSDN veya Wikipedia'yı kontrol edin. Ayrıca bu cevabın kaynakları.


5
Muhtemelen bir yerde ithalat lib söz gerekir. Tamam şimdi gideceğim. :)
Adam Mitz

2
Ele alınanlar kaldırıldı. Bunun için nasıl puan alabilirim? <g>
Adam Mitz

36

DLL nedir?

DLL dosyaları, yürütülebilir kod ve görüntüler, vb. Gibi kaynaklar içerebilen ikili dosyalardır. Uygulamaların aksine, bunlar doğrudan yürütülemez, ancak bir uygulama gerektiğinde (veya başlatma sırasında aynı anda) yükler.

Onlar önemli mi?

Çoğu uygulama başlangıçta ihtiyaç duydukları DLL dosyalarını yükler. Bunlardan herhangi biri bulunmazsa, sistem işlemi hiç başlatamaz.

DLL dosyaları başka DLL dosyaları gerektirebilir

Bir uygulama bir DLL dosyası gerektirdiği gibi, bir DLL dosyası diğer DLL dosyalarının kendisine bağımlı olabilir. Bağımlılık zincirindeki bu DLL dosyalarından biri bulunamazsa, uygulama yüklenmez. Bu, Dependency Walker gibi herhangi bir bağımlılık yürüteç aracı kullanılarak kolayca hata ayıklanır .

Sistem klasörlerinde çok fazla var

Sistem işlevselliğinin çoğu, kod / kaynakları paylaşmanın standart bir biçimi oldukları için DLL dosyaları biçimindeki bir kullanıcı programına maruz kalır. Her işlevsellik farklı DLL dosyalarında ayrı tutulur, böylece yalnızca gerekli DLL dosyaları yüklenir ve böylece sistemdeki bellek kısıtlamaları azaltılır.

Yüklü uygulamalar ayrıca DLL dosyaları kullanır

DLL dosyaları ayrıca yukarıda açıklandığı gibi fiziksel olarak işlevleri ayırmanın bir biçimi haline gelir. İyi uygulamalar da kesinlikle gerekli olana kadar DLL dosyalarını yüklememeye çalışır, bu da bellek gereksinimlerini azaltır. Bu da uygulamaların çok sayıda DLL dosyasıyla gönderilmesine neden olur.

DLL Cehennemi

Ancak, paylaşılan DLL dosyaları ile bunları gerektiren program arasında sürüm uyuşmazlığı olduğunda sistem yükseltmeleri bazen diğer programları bozar. Sistem kontrol noktaları ve DLL önbellek, vb. Bu sorunu çözmek için M $ girişimleri olmuştur. .NET platformu bu sorunla hiç karşılaşmayabilir.

Bir DLL dosyasının içinde ne olduğunu nasıl biliyoruz?

DUMPBIN veya Dependency Walker gibi harici bir araç kullanmanız gerekir; bunlar DLL dosyalarının içinde hangi genel olarak görünür işlevlerin (dışa aktarma olarak bilinir) gösterilmesini değil, aynı zamanda hangi DLL dosyalarının gerektirdiğini ve bu DLL dosyalarından hangi DLL dosyalarını dışa aktardığını da göstermelidir. bağlıdır.

Bunları nasıl yaratır / kullanırız?

Satıcınızdan programlama belgelerine bakın. C ++ için MSDN'deki LoadLibrary'ye bakın .


2
Lütfen bu cümleyi ( "The .NET platform might not face this issue at all.") bir nedeniyle tamamlayın . Teşekkürler.
Jogi

1
@RehanKhan .NET Framework v2.0 ile başlayarak, çalışma zamanı yalnızca .NET sürümü <= şu anda yüklü olan çalışma zamanı + Derlenmiş derleme derlemelerini yükleyecektir. .NET, daha önce bir çağrı zaten bir derleme, CL çalışma zamanı içeriyorsa derleme + yükleme denemelerini önbelleğe alır zaten yüklü olan montajı kullanacaktır. Sonuçta, bir programın çalışma zamanının yükleyeceği DLL'lere çok ağır kısıtlamalar uygulayarak sorunu çözdüklerini söylemek daha iyi olur (sadece vazgeçmeden ve yardımınızı istemeden önce).
Vladislav Martin

14

Bir kütüphanede bulunan bazı işlevleri kullanan bir yürütülebilir dosya oluşturduğunuzu varsayalım.

Kullandığınız kitaplık statikse , bağlayıcı bu işlevlerin nesne kodunu doğrudan kitaplıktan kopyalar ve yürütülebilir dosyaya ekler.

Şimdi bu yürütülebilir dosya çalıştırılırsa, gereken her şeye sahiptir, bu yüzden yürütülebilir yükleyici sadece belleğe yükler ve çalıştırır.

Kütüphane dinamikse , bağlayıcı nesne kodu eklemez, bunun yerine temel olarak bu işlevin bu konumda bu DLL'de bulunduğunu söyleyen bir saplama ekler .

Şimdi bu yürütülebilir dosya çalıştırılırsa, yürütülebilir dosyanın bitleri eksiktir (örn. Saplamalar), böylece yükleyici eksik saplamaları düzelterek yürütülebilir dosyadan geçer. Yalnızca tüm saplamalar çözüldükten sonra yürütülebilir dosyanın çalıştırılmasına izin verilir.

Bunu eylemde görmek için DLL dosyasını silin veya yeniden adlandırın ve yürütülebilir dosyayı çalıştırmayı denediğinizde yükleyicinin nasıl eksik bir DLL hatası rapor edeceğini izleyin.

Bu nedenle Dinamik Bağlantı Kütüphanesi adı , bağlama işleminin bölümleri yürütülebilir yükleyici tarafından çalışma zamanında dinamik olarak yapılır.

Son bir not, eğer DLL'ye bağlanmazsanız, bağlayıcı tarafından herhangi bir saplama eklenmeyecektir, ancak Windows hala yürütülebilir program başladıktan çok sonra DLL işlev giriş noktasını yürütmenizi sağlayan GetProcAddress API'sini sağlar.


12

DLL'ler (dinamik bağlantı kitaplıkları) ve SL'ler (UNIX altında eşdeğer olan paylaşılan kitaplıklar), yalnızca yükleme sırasında dinamik olarak yürütülebilir dosyaya bağlanabilen yürütülebilir kod kitaplıklarıdır.

Statik kütüphaneler bir derleme zamanında çalıştırılabilir bir dosyaya yerleştirilir ve bu noktadan sabitlenir. Yürütülebilir dosyanın boyutunu artırır ve paylaşılamaz.

Dinamik kütüphanelerin aşağıdaki avantajları vardır:

1 / Derleme zamanı yerine çalışma zamanında yüklenir, böylece yürütülebilir dosyadan bağımsız olarak güncellenebilirler (Windows'ta gördüğünüz tüm bu fantezi pencereler ve iletişim kutuları DLL'lerden gelir, böylece uygulamanızın görünümü ve hissi sensiz değişebilir yeniden yazmak zorunda).

2 / Bağımsız oldukları için kod birden fazla yürütülebilir dosyada paylaşılabilir - bu, bellek tasarrufu sağlar, çünkü tek bir DLL ile 100 uygulama çalıştırıyorsanız, bellekte yalnızca bir DLL kopyası olabilir.

Ana dezavantajı avantaj # 1 - DLL'lerin uygulamanızdan bağımsız olarak değişmesi, uygulamanızın çalışmasının durmasına veya tuhaf bir şekilde davranmaya başlamasına neden olabilir. DLL sürüm oluşturma, Windows altında çok iyi yönetilmeme eğilimindedir ve bu, antika olarak adlandırılan "DLL Hell" e yol açar.



6

http://support.microsoft.com/kb/815065

Bir DLL, aynı anda birden fazla program tarafından kullanılabilen kod ve veriler 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 bir Aç iletişim kutusu uygulamak için bu DLL içerdiği işlevi kullanabilir. Bu, kodun yeniden kullanılmasını ve etkin bellek kullanımını teşvik eder.

Bir DLL kullanarak, bir program ayrı bileşenlere modüler hale getirilebilir. Örneğin, bir muhasebe programı modül tarafından satılabilir. Modül takılıysa, her modül çalışma zamanında ana programa yüklenebilir. 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, programın diğer bölümlerini etkilemeden güncellemelerin her bir modüle uygulanması 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 dosyasında yalıtıldığında, tüm programı yeniden yüklemenize veya yüklemenize gerek kalmadan bir güncelleştirme uygulayabilirsiniz.

http://en.wikipedia.org/wiki/Dynamic-link_library


2

DLL bir Dosya Uzantısıdır ve Windows programları için birden fazla kod ve prosedürü tutmak için kullanılan “dinamik bağlantı kitaplığı” dosya biçimidir. Yazılım ve Oyunlar DLL Dosyalarının temelleri üzerinde çalışır; DLL dosyaları, birden çok uygulamanın bilgilerini aynı anda kullanabilmesi için oluşturuldu.

DLL Dosyaları hakkında daha fazla bilgi almak veya herhangi bir hatayla karşılaşmak istiyorsanız aşağıdaki yazıyı okuyun. https://www.bouncegeek.com/fix-dll-errors-windows-586985/


1

DLL dosyaları (Dinamik Bağlantı Kitaplıkları) bir veya daha fazla uygulama veya hizmet tarafından kullanılan kaynakları içerir. Sınıfları, simgeleri, dizeleri, nesneleri, arayüzleri ve geliştiricinin UI dışında depolaması gereken hemen hemen her şeyi içerebilirler.


3
Aslında bir kullanıcı arayüzünü saklayabilirler ve birkaç program bunu yapar. Örneğin ek bileşenler.
Brian R. Bondy

1

Microsoft'a göre

(DLL) Dinamik bağlantı kitaplıkları, uygulamaların çalışması için gereken veri, kod veya kaynakları içeren dosyalardır. Bunlar, Windows ekosistemi tarafından oluşturulan ve iki veya daha fazla uygulama arasında paylaşılabilen dosyalardır.

Bir program veya yazılım Windows'ta çalıştığında, uygulamanın nasıl çalıştığının çoğu programın DLL dosyalarına bağlıdır. Örneğin, belirli bir uygulamanın birkaç modülü varsa, her bir modülün birbirleriyle nasıl etkileşimde bulunduğu Windows DLL dosyaları tarafından belirlenir.

Ayrıntılı açıklama istiyorsanız, bu yararlı kaynakları kontrol edin

Dll dosyaları nelerdir , Dll dosyaları hakkında

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.