|
COM İstemcileri İçin .NET Komponenti Hazırlamak |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bu makalede dotNET
platformunda hazırlanan sınıflara COM istemcilerinin nasıl erişebileceğini inceleyeceğiz.
Bu amaçla dotNET ile birlikte gelen RegAsm.exe ve TlbImp.exe araçlarının
kullanımı ve amacı anlatılacaktır.
Bu konu ile ilgili bir
önceki makalede COM ve ActiveX komponentlerinin .NET platformunda nasıl
kullanılabileceğini incelemiştik. Bu yazıda ise bu işlemi tersten düşünüp COM
istemcilerinin .NET komponentlerine ne şekilde erişebileceğini inceleyeceğiz.
.NET komponentlerindeki bazı özellikler dışında ki bütün özellikler COM tarafından
erişilebilir durumdadır. Peki .NET komponentlerinin COM istemcileri tarafından
erişilebilmesi için hangi şartlar sağlanmalıdır?
1 - Sadece public olan elemanlar COM istemcileri tarafından erişilebilir
durumdadır. Bu yüzden eğer .NET türlerine(type) COM istemcileri tarafından erişilmesi
isteniyorsa türler public olarak işaretlenmelidir.
2 - Bazı üye elemanlar COM istemciler tarafından kullanılamayabilir.
Örneğin parametreli yapıcı metotlara, statik metotlara ve sabit alanlara(fields)
COM istemcileri erişemez.
3 - COM istemcileri tarafından erişilecek üye elamanlar public olmalıdır.
Örneğin bir metot public bir sınıf içerisinde olsa bile bu metodun COM tarafından
erişilir bir durumda olması için metodun public olarak bildirilmiş olması gerekir.
Bu kural diğer üye elemanlar olan özellikler(properties), olaylar(events) ve
diğer veri alanları(fields) için de geçerlidir.
Public olarak bildirilmiş bir elemanın COM tarafından erişilmesini engellemek
için System.Runtime.InteropServices isim alanında bulunan ComVisible
niteliğinin kullanılması gerekir. Örneğin aşağıdaki Deneme() metodu public olarak
bildirilmiş olmasına rağmen ComVisible niteliği ile işaretlendiği için COM istemcileri
tarafından erişilemez durumdadır.
using
System.Runtime.InteropServices;
public class DenemeSınıf
{
public MyClass()
{
}
[ComVisible(false)]
public int Deneme(int
a)
{
return
0;
}
}
|
Not : ComVisible niteliği assemblylere, arayüzlere, sınıflara, temsilcilere, yapılara,
numaralandırmalara, metotlara ve özelliklere uygulanabilir.
4 - COM
istencilerinin .NET nesnelerini oluşturabilmesi için .NET türlerinin public
olarak bildirilmiş varsayılan yapıcı metoda(default constructor) sahip olması
gerekir. (Varsayılan yapıcı metotlar parametre almayan yapıcılardır.)
5 - Özet türler(Abstract Types) COM istemcileri tarafından kullanılamaz.
.NET
Türleri COM İstemcilerine Nasıl Hazırlanır?
Hatırlarsanız COM komponentlerini .NET ortamında kullanırken RCW(Runtime
Callable Wraper) sınıflanı oluşturmuştuk. Bir COM komponentini .NET istemcisine
uygun bir şekilde dönüştüren ara türe Runtime Callable Wrapper denilmektedir.
Yine aynı şekilde .NET komponentlerini COM uyumlu hale getirmek için ara türlerden
faydalanılacaktır. COM istenmcilerinin .NET komponentlerine referans verebilmesi
amacıyla CCW(COM Callable Wraper) türleri oluşturacağız. COM istemcileri ve
.NET komponentleri arasındaki ilişkiyi özetlemek açısından aşağıdaki grafiği
inceleyin.
Bir COM istemcisi .NET komponentine erişmek istediği zaman hem CCW hemde .NET
nesneleri oluşturulur. Ancak sonraki COM istemlerinde yeniden bir CCW oluşturulmaz.
CCW sarmalyıcı türleri oluşturmak için iki yöntem kullanılmaktadır. Bunlardan
birincisi TlbExp.exe(Type Library Exporter) aracı ikincisi ise RegAsm.exe(Register
Assembly) aracıdır.
RegAsm.exe(Register
Assembly) Aracı
RegAsm aracı .NET komponentine ilişkin tür bilgilerini sistemin registery bölgesine
kayıt eder. Böylece COM istemcisi bu bölgedeki tür bilgilerini kullanarak .NET
komponentlerini kullanabilir. Şimdi bir .NET komponentinin COM istemcisi tarafından
nasıl kullanılacağını bir örnek ile adım adım inceleyelim. İlk adım olarak Visual
Studio.NET ile bir "Class Library" projesi açıp sınıfımızı aşağıdaki
gibi geliştirelim.
//Toplama.cs
using
System;
namespace
csharpnedir
{
public class DortIslem
{
public
int Toplam(int sayi1,
int sayi2)
{
return
sayi1 + sayi2;
}
private
int Carp(int sayi1, int sayi2)
{
return
sayi1 * sayi2;
}
}
}
|
Hazırladığımız DorIslem sınıfının COM istemcisi tarafından erişebilir duruma
getirilmesi için projeyi derledikten sonra .NET komponentinin GAC(Global Assembly
Cache)e yüklenmesi gerekir. Assemblylerin GACa yüklenebilmesi için .NET ile
birlikte gelen sn.exe aracı kullanılarak Assembly için tekil bir isim
oluşturulması gerekmektedir. Bu yüzden projeyi derlemeden önce sn.exe aracı
ile anahtar.snk isimli bir dosya oluşturacağız ve projeye ait AssemblyInfo.cs
dosyasına anahtar.snk dosyasının yolunu yazacağız.
Not : sn.exe aracı
ve GAC hakkında daha ayrıntılı bilgi içeren makaleyi okumak için tıklayınız.
Komut satırından
sn /k anahtar.snk
yazarak tekil ismi içeren anahtar.snk isimli dosyanın oluşmasını sağlayın. Ardından
AssemblyInfo.cs dosyasında aşağıdaki değişiklikleri yapın.
----
[assembly: AssemblyKeyFile("../../anahtar.snk")]
----
Parantez içindeki ifade anahtar.snk dosyasının oluşturulan .NET komponentine
göre olan göreceli yoludur. Bu bilgi "C:\anahtar.snk" şeklinde de
olabilirdi.
Şimdi gacutil.exe aracını kullanarak oluşturduğumuz .NET komponentini GACa
yüklememiz gerekir. Komut satırından gacutil.exe aracını aşağıdaki gibi çalıştırın.
gacutil /i Toplama.dll
Eğer anahtar.snk dosyası doğru bir şekilde komponentimizle ilişkilendirildiyse
komut satırında
Assembly successfully added to the cache (Assembley GACa
başarıyla eklendi)
mesajı verilecektir.
Eğer anahtar.snk dosyası oluşturduğumuz komponentle(assembly) doğru bir biçimde
ilişkilendirilmediyse bu sefer
Failure adding assembly to the cache : Attempt to install
an assembly without a strong name
mesajı(hatası) verilecektir.
GACa yüklenen
.NET komponentimiz artık RegAsm.exe aracının bir girdisi olmaya hazırdır. Son
adımda RegAsm.exe aracını kullanarak .NET komponentimizin COM istemcileri tarafından
erişebilir hale getireceğiz. Komut satırından aşağıdaki komutu çalıştırın
regasm.exe Toplama.dll
Bu işlem sonucunda eğer
Types registered successfully
mesajı alındıysa .NET komponentimiz bütün COM istemcileri tarafından çağrılabilir.
Sonunda sıra çalışmamızın sonucunu görmeye geldi. Bir COM istemcisi olan IIS(Internet
Information Server) i kullanarak ASP üzerinden regasm ile kayıt ettiğimiz COM
uyumlu .NET komponentini kullanacağız. Bu amaçla bir ASP sayfası hazırlayıp
IISin bir dizini olan WWWROOTunm altına kopyalayacağız. Bu sayfada iki textbox
yardımıyla iki sayı alıp bu sayıları oluşturduğumuz komponentin Toplam() metoduna
göndereceğiz. Ardından sonucu yine aynı sayfa üzerine "Response.Write"
ile yazdıracağız. Yazmanız gereken asp sayfası aşağıdaki gibidir.
//deneme.asp
(http://localhost/deneme.asp şeklinde çağrılmalıdır)
<html>
<form action = "deneme.asp" method=post>
Sayı 1 = <input type = text name="sayi1"><br>
Sayı 2 = <input type = text name="sayi2"><br>
<input type=submit value="Topla">
</form>
<%
Dim o,r,i1,i2
Set o = Server.CreateObject("csharpnedir.Dortislem")
i1 = cint(request.form("sayi1"))
i2 = cint(request.form("sayi2"))
r = o.Toplam(i1,i2)
response.write "Toplam = " &
r
%>
</html>
|
Not : Burda COM istemcisine örnek olarak bir asp sayfası verilmesine
rağmen siz istediğiniz COM istemcisini kullanabilirsiniz. Örneğin bir Visual
Basic yada Visual C++ projesi açarak oluşturduğumuz .NET komponentini kullanabilirsiniz.
Tarayıcınızdan http://localhost/deneme.asp şeklinde bir istekte bulunduğunuzda
açılacak sayfadan 23 ve 12 sayılarını girildiğinde aşağıdaki ekran görüntüsünü
elde edilmelidir.
Oluşturulan asp sayfasından .NET komponentindeki Carp() metodunu kullanamayız.
Çünkü bu metot public olarak bildirilmemiştir.
COM nesneleri iki şekilde bağlanabilir. Bunlar erken bağlama(late binding) ve
geç bağlama(early binding) dır. ASP geç bağlama tekniği ile çalışmaktadır. Yani
COM nesnelerinin türleri derleme zamanında bilinmek zorunda değildir.(ASPde
derleme işlemi yoktur) COM nesneleri çalışma zamanında ilgili motor tarafından
üretilir. Erken bağlamada ise derleme zamanında türlerin bilinmesi gerekmektedir.
Eğer bir istemci erken bağlama modelini destekliyorsa regasm aracını daha önce
kullandığımız gibi kullanamayız. Erken bağlamayı destekleyen COM istemcileri
için regasm aracını aşağıdaki gibi çalıştırmalıyız.
regasm Toplama.dll
/tlb:Toplama.tlb
TlbExp(Type
Library Exporter) Aracı
Erken bağlamayı destekleyen COM istemciler için regasm yerine istersek tlbexp
aracını da kullanabiliriz. Bu durumda tlbexp aracını aşağıdaki gibi kullanmalıyız.
tlbexp Toplama.dll
Yukarıdaki kullanımla ile regasm aracının tlb parametresi ile kullanımı arasında
bir fark yoktur. Her iki işlemden sonra COM uyumlu bir istemci erken bağlama
metodunu kullanarak .NET komponentimize referans verebilir.
Bu yazının sonuna geldik. Bir sonraki yazıda .NET ortamında, COM komponentlerinin
daha da ötesinde olan Win API fonksiyonlarının nasıl kullanılacağını inceleyeceğiz.
Bu makale makalede geçen örnek uygulama ile ilgili her türlü sorunuzu bana sorabilirsiniz.
Makale:
COM İstemcileri İçin .NET Komponenti Hazırlamak C#, Visual C# ve .NET Sefer Algan
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|