www.cihansalim.net
site içindeİnternet'te

 Dergi Yazıları
   
"COM ve .Net Projeleri Arasında Entegrasyon"

.Net Derleyicilerini COM'da kullanabiliriz
Buraya kadar eski "çalşmalarımızı" yeni ortama alma yollarını araştırdık,
tıklayın, destekleyin:
yani .Net'in geriye uyumluluğunu kullandık. Ama aynı şekilde .Net derleyicilerimizi de COM'a taşıyabilir, yani eski uygulamaları yeni metotlarla çalıştırabiliriz.

Az önce, şemada da gördüğümüz aracılar burada yine emrimizde. COM tabanlı bir uygulamadan ulaşılabilir bir kapsayıcı sınıf, .Net derleyicisini kullanılabilir kılıyor. Ortada yer alan bu sınıf "Çağrılabilir COM Kapsayıcısı" (COM Callable Wrapper-CCW) olarak adlandırılıyor. Hemen bu sınıftan nasıl yararlanacağımıza geçelim.

Visual Studio.NET ile COM'a derleyici taşımak
Visual Studio.NET'te sınıf kitaplığı türünde yeni bir projeye başlayalım. Adı bizim örneğimizde DotnetForCom olsun. Bu sınıfa standart bir 'constructor' ekleyelim. Ve tabii COM'da kullanmak istediğiniz genel metotlar varsa onları da ekleyelim. Ardından Solution Explorer'daki projemize sağ tıklayıp Properties'i açalım. Projenin özellikleri sayfasında Configuration özelliklerini ve de ardından Build seçeneğini tıklayın. Gelen ekranda "Register for COM Interop" seçeneğini işaretliyoruz. Böylece projeyi kurduğunuzda, .Net derleyicisi COM Interop'u için otomatik olarak kaydedilecek. Artık bu derleyiciyi COM'dan kullanabileceksiniz.

Diyelim Visual Basic 6.0'da kullanmak istiyorsunuz. Yeni bir Visual basic 6.0 projesine başladığınızda ve Proje menüsünden Referans'ları seçtiğinizde, .Net derleyicinizin bir referans olarak hazır olduğuna tanık olacaksınız. Böylece .Net derleyicisinin işlevselliğine Visual basic 6.0'dan ulaşabileceksiniz.

Visual Studio.NET dışında derleyici taşımak
Tabii burada da tek çözüm Visual Studio.Net değil. Birkaç adımda bu işi elle de yapabiliriz. Öncelikle .Net derleyicisi standart 'constructor' sağlamak zorunda çünkü COM istemcileri .Net'te kullanabildiğimiz parametreli constructor'ları desteklemiyor. Yani söz konusu sınıf için bir "default constructor" sağladığınıza emin olun. Tabii standart bir constructor olmak şartıyla parametreli olanları da bunun yanında kullanabilirsiniz.

Tür kitaplıkları oluşturmak sonraki adım. .Net derleyici için tür kitaplıkları yaratıp bunları registry'e girmek gerekiyor. Bunun için iki yol var:
- .Net çatısı altında gelen "Tür Kitaplığı Verme Programı"nı (Type Library Exporter) kullanarak kitaplığı yaratırız. Ardından da "derleyici kaydedici" (Assembly Registration) aracıyla bunu registry'e gireriz, örneğin:
Tlbexp test.dll /out:test.tlb Regasm test.dll
- Ya da doğrudan tür kitaplığını oluşturup Ragasm yardımıyla kaydederiz:
Regasm test.dll /tlb:test.tlb

.Net derleyici Global Assembly Cache içinde yer almalı ve de 'Strong Name' olmalı. Bu amaç içinse Strong Name aracını (Sn.exe) kullanarak derleyici için bir anahtar oluşturmamız gerekiyor. Bunu yaptıktan sonra derleyiciyi, Global Assembly Cache Tool (Gacutil.exe) kullanarak, Global Assembly Cache (GAC) içine ekleyebilirsiniz:
gacutil -I SampleAssembly.dll

Artık .Net derleyicisini bir referans olarak COM'a ekleyebilirsiniz. Peki Çağrılabilir COM Kapsayıcı'na ne oldu? COM uygulamalarından .Net derleyicisine bir çağrı yapıldığında kapsayıcı otomatik olarak oluşturuluyor. Ve düzenlenmiş kodla düzenlenmemiş olan arasındaki köprü görevini gerçekleştiriyor.

Ayrıca özelliklerden yararlanarak yönlendirme biçimini değiştirebilirsiniz. Özellikler üç türde:
-Tasarım sırasında uyguladığımız özellikler
-InterOp araçlarıyla uygulanan özellikler
-Bizim ya da InterOp'un uyguladığı özellikler

En sık kullanılanlar "GuidAttribute", "ProgldAttribute", "MarshalAsAttribute" ve de "COMVisibleAttribute". İlk ikisi, GUID'i ve sınıfların "ProgID"lerini belirlemede kullanılıyor. MarshalAsAttribute ise isteğe bağlı çünkü tüm veri türleri kendi marshal özelliklerine sahip. String gibi veri tiplerinde ise aynı veri türü birkaç kere marshal aşamasından geçebiliyor ve bu durumda MarshalAsAttribute yararlı oluyor. .Net çatısı altındaki String'in düzenlenmemiş kod altındaki karşılıkları şunlardan biri olabiliyor:
-LPStr
-LPStr
-LPWStr
-LPTStr
-BStr

Standart durumda String bir BStr olarak yönlendiriliyor. Bu özellik diğer tüm düzenlenmemiş türler için de uygulanabilir.
Gelelim COMVisibleAttribute'e. Düzenleyici içindeki türlerin gizliliğini kontrol eden bu özellik yaratıldığında herkese açık olan türleri gizlemek için kullanılıyor. Bu özellikler hakkında daha detaylı bilgi almak için Microsoft'un sitesinde ilgili bölüme giderek "Applying InterOp Attributes" diye bir arama yapın.

InterOp Kullanırken
Unutulmaması gereken önemli nokta, bir COM nesnesini .Net'e aktardığınızda ya da tersi durumda bir performans kaybı yaşanacağı. Bunun nedeni de malum yönlendirme. Performanstaki değişim yine veri türlerine bağlı. Tamsayıları kullanan ya da az sayıda byte'dan yararlanan basit veriler önemli bir performans farkı yaratmayacaktır. Bunun nedeni de bu basit veri türlerinin gerek düzenlenmiş gerekse de düzenlenmemiş ortamlarda aynı şekilde tanımlanıyor olması. Böylece de "InterOp Marshaler"ın görevi minumuma iniyor. String verilerin kullanımı ise, bunlar iki ortamda farklı tanındığı için, performansı düşürüyor. InterOp Marshaler bu veri türleri için destek sunuyor. Ama daha karışık veriler işin içindeyse, elinizle MSIL kodunu düzenlemeniz gerekiyor.

Özellikle .Net çatısının getirdiği kolaylıklar ile iki paltformun uyumluluğunun nasıl kolaylaştığını gördük. Kaspayıcı sınıflar köprü görevlerini oldukça iyi yerlerine getiriyorlar ve de düzenlenmiş kodla düzenlenmemiş arasında bir bağ kurmaya yardımcı oluyorlar. Böylece seçim, yazılım ve sistem geliştiricilere kalıyor. Nerede InterOp kullanacakları, nerede yeni bir kod oluşturacaklarını seçerken tabii ki şunu da unutmamak lazım ki yeni kodun sağlamlığını birkaç testten geçirmek gerekiyor, o nedenle bazen eski, denenmiş ve sağlam olduğu görülen kodları kullanmak yararlı olabilir.

.Net derleyicileri hem meta veri hem de yüklenebilir ve de "yayılabilir" bir kod birimi tanımlıyorlar. .Net platformunda tasarım aşamasındayken unutulmaması gereken en önemli noktalardan biri de belki derleyicinin kodu başka ortamlarda kullanmak üzere konuşlandırma özelliğinin gelişmiş olması. Bileşenleri en etkin şekilde hazırlayarak son derece işlevsel hale sokan bir çok proje bazen sadece bu noktaya gereken önemi ayırmadığından başarısız olabiliyor.

Yani COM'u bir kenarda bırakmayın
Şu bir gerçek ki .Net oldukça yeni bir platform, hele uygulama geliştirme açısından ülkemizde keşfedileli çok olmadı. Visual Basic, VC++ gibi ortamlarda oluşturulan COM bileşenleri komut dosyaları ya da kodlarla bağlanıp Windows2000'de COM+, NT4.0'de MTS ile yönetilebiliyor. Ama .Net artık tam anlamıyla burada ve tabii yeniliklere ayak uydurmak, .Net'i ciddi olarak göz önüne almak lazım.

Bu yazıda işlediğimiz gibi, COM nesnelerinin de .Net çatısında kapsayıcı sınıflar yardımıyla hala kullanılabilir olmaları oldukça cesaretlendirici. Visual Studio.NET'in bu köprülerin kurulmasını son derece basite indirgemesi ve de kullanıcısına bunu son derece açık bir biçimde sunması da cabası. Artık COM'da çok çaba vererek hazırladığınız işlevsel kodları "Keşke .Net'e alabilseydim" diye hayıflanmayacaksınız. Tüm bunlar .Net çatısı altında yenilikler üretmeye korkmadan girişmenizi de sağlayacaktır.


SON

« 1. sayfa «