Mega Code Archive

 
Categories / Delphi / Strings
 

Net, assemblies ve dll’ler için delphi

{www.freemine.com.tr.tc} DLL (Dynamic Link Library), başlı başına program parçacıkları olup, programlarımızda kullandığımız rutinleri bize ulaştırırlar. Hazır fonksyonları bize yani programlarımıza export ederler. Bu durumda DLL kullanmak için bizim de programımıza import etmemiz gerekir. DLL’lerin kullanımı, rutinlerinin pek açıklayıcı içeriğe sahip olmamasından dolayı bir miktar zordur. Ayrıca programımıza import ettiğimiz bir DLL farklı bir versiyon içermesi durumunda programın çökmesine sebep olabilir. Program aradığı rutinleri bulamaması durumunda hata verecek veya farklı işlemlerle amaç dışına çıkacaktır. The Component Object Model (COM), bu tür durumlar için arı özellikler içeriyor. Ancak teknolojisinin DLL teknolojisi üzerine kurulu olduğu düşünülürse, tam çözüm verdiği düşünülemez. .Net Assembly, DLL teknolojisinde yeni bir yaklaşım olarak yerini alıyor. Sıralı rutinlerin yerine “class” mantığı kullanılıyor. “class” ların her biri detaylı anlatımlar içeriyor. Taglar arasında kolaylıkla gezinip bilgi alınabiliyor. Bir yenilik de eklediğimiz rutinler için kullandığımız headerlar tarih oluyor. Kısacası import etmemiz gereken kod parçalarına gerek kalmıyor. .Net teknolojisi getirdiği yenilikler ile eskiyi de ihmal etmiyor. Şimdi Win32 için ve .Net için DLL geliştirip kullanalım ve karşılaştıralım: MyDLL: Win32 için bir DLL yazalım ve kullanalım, library MyDLL; function TheAnswer: Integer; stdcall; export; begin Result := 42 end; exports TheAnswer; begin end. UseDLL : Yazdığımız DLL dosyasını import ederek sayfamıza katmamız gerekir. Bunu da “external” komutu ile yapınız. program UseDLL; {$APPTYPE CONSOLE} function TheAnswer: Integer; external 'MyDLL.dll'; begin writeln('The Answer is: ', TheAnswer) end. MyASM : Gördüğümüz gibi class oluşturulup rutinler bu clasın altında tanımlanıyor. Ayrıca dikkat ederseniz class tanımlamasında “T” harfi kullanılmamış. Yıllarca Delphi kullanıcılarının sembolü haline gelen prefiximiz tarih oluyor gibi. Bunun yanında belirtmek gerekiyor ki. .Net teknolojisinde söz sahibi olmak istiyorsanız C# ile aranızı iyi tutmaya bakın. library MyASM; type LifeTheUniverseAndEverything = class constructor Create; function TheAnswer: Integer; end; constructor LifeTheUniverseAndEverything.Create; begin end; function LifeTheUniverseAndEverything.TheAnswer: Integer; begin Result := 42 end; end. UseASM : Dikkat ettiyseniz MyASM dosyası unit olarak çağırılıyor. .Net teknoojisinin güçlü bir özelliğini görüyoruz. Oluşturduğumuz dosya farklı meta datalar içerebilir. Bu ne demek? Kısaca şöyle açıklayabiliriz. Oluşturduğumuz unit farklı, farklı .Net dillerinde de kullanılabilir. Örneğin C# gibi... program UseASM; {$APPTYPE CONSOLE} uses MyASM; var X: LifeTheUniverseAndEverything; begin X := LifeTheUniverseAndEverything.Create; writeln('The Answer is: ', X.TheAnswer) end. .Net İçinde DLL Kullanımı : Programımızda hazır bir rutin kullanmak istedik. Örneğin bu rutin MyDLL.dll dosyasında bulunsun. Şimdi .Net için yazacağımız kodu görelim : program UseDLLdotNet; {$APPTYPE CONSOLE} uses System.Runtime.InteropServices; function TheAnswer: Integer; stdcall; external 'MyDLL.dll'; begin writeln('The Answer is: ', TheAnswer) end. Tabiki Win32 için hazırlanmış, DLL dosyasının sistemin yapısına zarar vermemesi düşünülemez. Bunu engellemek için “DLLImport” özelliğini kullanabilirsiniz. program UseDLLdotNet; {$APPTYPE CONSOLE} uses System.Runtime.InteropServices; [DllImport('MyDLL.dll')] function TheAnswer: Integer; external; begin writeln('The Answer is: ', TheAnswer) end. Ein 32’den kalma DLL’ ler kullanmamızın güvenilir yolunu oluşturuyor. “Delphi for .Net” de “Borland.Win32.Windows.Pas” unitini kullanarak, eski Win32 Api’lerini import edip kullanıyor.