On 12:14 with No comments

Bu bölümde sorunları ve kendi DLL geliştirirken dikkate almanız gerekir gereksinimleri açıklanmaktadır.
DLL türü

DLL içinde bir uygulama yüklediğinizde, dışarı aktarılmış DLL işlevi çağırma bağlama için iki yöntem sağlar. Bağlama iki yükleme zamanı dinamik bağlama ve çalışma zamanı dinamik bağlama yöntemlerdir.
Yükleme zamanı dinamik bağlama
Yükleme zamanı dinamik bağlama uygulamanın yerel işlevler gibi dışarı aktarılmış DLL işlevi açık çağrılar yapar. Yükleme zamanı dinamik bağlama kullanmak için bir başlık (.h) dosyası ve bir içe aktarma kitaplık (.lib) dosyası derlemek ve uygulama bağlantı sağlar. Bunu yaptığınızda, bağlayıcı sistem DLL'i ve dışa aktarılmış DLL işlevi konumları yükleme zamanında çözmek için gerekli olan bilgiyi sağlayacaktır.
Çalışma zamanı dinamik bağlama
Uygulama çalışma zamanı dinamik bağlama içinde LoadLibrary işlevini veya çalışma zamanında DLL'i için LoadLibraryEx işlevini çağırır. DLL başarıyla yüklendikten sonra aramak istediğiniz dışa aktarılmış DLL işlevi adresini elde etmek için GetProcAddress işlevini kullanın. Çalışma zamanı dinamik bağlama kullandığınızda, bir içe aktarma kitaplığı dosya gerekmez.

Kullanım yükleme zamanı dinamik bağlama ve çalışma zamanı dinamik bağlama kullanmak ne zaman zaman uygulama ölçütleri aşağıdaki listede açıklanmaktadır:
Başlangıç performansı
Uygulamanın başlangıç performansını önemli ise, çalışma zamanı dinamik bağlama kullanmanız gerekir.
Kullanım kolaylığı
Yükleme zamanı dinamik bağlama içinde dışarı aktarılmış DLL işlevi yerel işlevlerdir. Bu, bu işlevleri çağırmak kolaylaştırır.
Uygulama mantığı
Çalışma zamanı dinamik bağlama uygulamanın gerektiği gibi farklı modülleri yüklemek için dallanma. Birden çok dil sürümlerini geliştirirken, bu önemlidir.
DLL giriş noktası

DLL oluşturduğunuzda, isteğe bağlı olarak bir giriş noktası işlevi belirtebilirsiniz. İşlemler veya iş parçacıkları kendilerini DLL'e eklediğinde veya kendilerini DLL'den ayırdığında giriş noktası işlevi çağrılır. Veri yapıları başlatılamıyor veya DLL gerektirdiği gibi veri yapıları yıkmak için giriş noktası işlevini kullanabilirsiniz. Ayrıca, çok iş parçacıklı bir uygulama ise, iş parçacığı yerel depolaması (TLS) içinde giriş noktası işlevini her iş parçacığına özel bellek ayırmak için kullanabilirsiniz. Aşağıdaki kod örneği DLL giriş noktası işlevi yer almaktadır.
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şlevi FALSE değeri geri döndüğünde, yükleme zamanı dinamik bağlama kullanıyorsanız, uygulama başlamaz. Çalışma zamanı dinamik bağlama kullanıyorsanız, yalnızca tek tek DLL'i yüklemede başarısız olacaktır.

Giriş noktası işlevi yalnızca basit başlatma görevleri yerine getirmeniz gereken ve herhangi bir DLL yükleme veya sonlandırma işlevleri çağırmalıdır değil. Örneğin, giriş noktası işlevi, doğrudan veya dolaylı olarak LoadLibrary işlevini veya LoadLibraryEx işlevini çağırmalıdır değil. Bir işlemi sonlandırırken ayrıca FreeLibrary işlevi çağırmalısınız değil.

Not: Çok iş parçacıklı uygulamalarda, DLL genel verilere erişimin eşitlendiğinden emin olun (olası veri bozulmasını önlemek için iş parçacığı güvenli). Bunu yapmak için her iş parçacığı için benzersiz veri sağlamak için TLS kullanın.
DLL işlevlerini dışarı aktarma

DLL işlevlerini dışarı aktarmak için function anahtar sözcüğü eklemek için dışarı aktarılmış DLL işlevi veya dışarı aktarılmış DLL işlevi listeleyen bir modül tanım (.def) dosyası oluşturun.

Function anahtar sözcüğü kullanmak için aşağıdaki anahtar sözcüğü ile vermek istediğiniz her işlevi bildirmeniz gerekir:
__declspec(dllexport)
Uygulamada dışarı aktarılmış DLL işlevi kullanmak için aşağıdaki anahtar sözcüğü ile almak istediğiniz her işlevi bildirmeniz gerekir:
__declspec(dllimport)
Genellikle, bir tanımlama deyimi ve dışa aktarma ifadesi ayırmak için bir ifdef deyimi ve import deyimini sahip bir başlık dosyası kullanın.

Modül tanım dosyası, dışarı aktarılmış DLL işlevi bildirmek için de kullanabilirsiniz. Modül tanım dosyası kullandığınızda, dışarı aktarılmış DLL işlevi için function anahtar sözcüğü eklemek zorunda değildir. Modül tanım dosyasında, LIBRARY deyimi ve EXPORTS deyimi DLL için bildirin. Aşağıdaki kod bir tanım dosyası örneğidir.
// SampleDLL.def
//
LIBRARY "sampleDLL"

EXPORTS
  HelloWorld
Örnek DLL ve uygulama

Microsoft Visual C++ 6.0 içinde bir DLL Dinamik bağlantı kitaplığı Win32 proje türü veya MFC AppWizard (dll) proje tipini seçerek oluşturabilirsiniz.

Aşağıdaki kod, Visual c++'ta Win32 dinamik bağlantı kitaplığı proje türü kullanılarak oluşturulan 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_DLL
extern __declspec(dllexport) void HelloWorld() ;
#else
extern __declspec(dllimport) void HelloWorld() ;
#endif

#endif
Aşağıdaki kod, SampleDLL DLL'deki dışa aktarılmış DLL işlevi çağıran bir 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;
}
Not: Yükleme zamanı dinamik bağlama içinde SampleDLL projeyi oluşturduğunuzda, oluşturulan SampleDLL.lib içeri aktarma kitaplığı bağlamanız gerekir.

Çalışma zamanı dinamik bağlama aşağıdakine benzer bir kod kullanın SampleDLL.dll çağıran kodu dışa aktarılmış DLL işlevi.
...
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);
}
...
Derlemek ve bağlamak SampleDLL uygulama, Windows işletim sistemi SampleDLL DLL aşağıdaki konumlarda sırayla arar:
Uygulama klasörü
Geçerli klasör
Windows sistem klasörü

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

Not: GetWindowsDirectory işlevi Windows klasörünün yolunu döndürür.
.NET Framework derleme

Microsoft .NET ve .NET Framework girişi ile DLL'leri ile ilişkili sorunların çoğunu derlemeleri kullanarak elenen. Bir derleme .NET ortak dil çalışma zamanı (CLR) denetimi altında çalışan işlevselliğin mantıksal bir birimdir. Derleme, bir .dll dosyası veya bir .exe dosyası olarak fiziksel olarak bulunmaktadır. Ancak, dahili bir derleme bir Microsoft Win32 DLL dosyasından çok farklıdır.

Derleme dosyası bir derleme bildirimi, meta veri türü, Microsoft Ara dili (MSIL) kodu ve diğer kaynakları içerir. Derleme bildirimi bir derleme kendinden açıklayıcı olması gerekli olan tüm bilgiyi sağlayan birleştirme meta verileri içerir. Aşağıdaki bilgiler derleme bildiriminde bulunmaktadır:
Derleme adı
Sürüm bilgisi
Kültür bilgileri
Kesin ad bilgileri
Dosyaların Montaj Listesi
Türü başvuru bilgileri
Başvurulan ve bağımlı derleme bilgileri
Derlemede bulunan MSIL kodu doğrudan çalıştırılamaz. Bunun yerine, MSIL yürütmeyi üzerinden yönetilir. Varsayılan olarak, bir derleme oluşturduğunuzda derlemeyi uygulamaya özeldir. Paylaşılan bir derleme oluşturmak için derleme için tanımlayıcı bir ad atayın ve sonra derleme genel derleme önbelleğinde yayımlamak gerektirir.

Win32 DLL'leri özelliklerine göre derlemeler özelliklerinden bazıları aşağıdaki listede açıklanmaktadır:
Kendini açıklayan
Bir derleme oluşturduğunuzda, CLR derleme çalıştırmak gerekli olan tüm bilgileri derleme bildiriminde bulunur. Derleme bildirimi bağımlı derlemelerin bir listesini içerir. Bu nedenle, tutarlı bir uygulamada kullanılan derlemelerin kümesini CLR koruyabilirsiniz. Win32 DLL'leri paylaşılan DLL'ler kullandığınızda bir uygulamada kullanılan dll dosyaları kümesi arasında tutarlılığı korunamaz.
Sürüm oluşturma
Bir derleme bildiriminde sürüm bilgilerinin kaydedildiği ve CLR tarafından zorlanan. Ayrıca, sürüm ilkeleri zorla sürüme özgü kullanım sağlar. Win32 DLL'leri sürüm işletim sistemi tarafından zorlanamaz. Bunun yerine, DLL dosyaları geriye dönük olarak uyumlu olduğundan emin olmalısınız.
Yan yana dağıtım
Dağıtım yan yana derlemeler destekler. Bir uygulama bütünleştirilmiş bir sürümünü kullanabilir ve başka bir uygulamanın derleme farklı bir sürümünü kullanabilirsiniz. Windows 2000'de başlayarak, yan yana dağıtım DLL'ler uygulama klasörü bularak desteklenir. Ayrıca, Windows Dosya Koruması sistem DLL'leri üzerine veya yetkisiz bir aracı tarafından değiştirilmesini önler.
Kendinden kapsama ve yalıtım
Bağımsızdır ve bilgisayarda çalışan diğer uygulamalardan ayrı bir derleme kullanılarak geliştirilen bir uygulama olabilir. Bu özellik sıfır etkisi yüklemeleri oluşturmanıza yardımcı olur.
Yürütme
Derleme CLR tarafından kontrol edilir ve derleme bildiriminde sağlanan güvenlik izinleri altında çalıştırılır.
Bağımsız dil
Bir derleme .NET desteklenen dillerin herhangi biri kullanılarak geliştirilebilir. Örneğin, Microsoft Visual C# derleme geliştirin ve sonra Microsoft bir Visual Basic .NET projesinde derlemeye kullanın.