ÜYE GİRİŞİ  
Kullanıcı adı :
Parola :
 
  Üye Ol!  
 
 
ANASAYFA HABERLER ASP ASP.NET PHP C/C++ C# JAVA ARAMA İLETİŞİM

ASP.NET
  Expression Web ile Site Yapimi
  Web Server Control Yazmak - 2
  Web Server Control Yazmak - 1
  Sql Cache Dependency
  Web Kontrollerini Etkin Kullanmak
  Xslt Kullanımı
  Bir Web Sayfasının Anatomisi
  Client Script Callback
  Login Kontrollerinin Kullanımı

ASP
  ASP Nesneleri
  29 Soruda ASP
  Matematiksel Uygulamalar
  Select Case Yapısı 2
  Fonksiyon(Function) Kullanımı
  IF-ELSE...
  GET Yöntemi ile İşlemler
  Asp de Tarih ve Saat fonksiyonları
  While-wend döngüsü

C Sharp (C#)
  C#'da klasör işlemleri
  C# ile diziyi tersine çevirme
  Çok Kullanılan Kontroller-1
  C# ile Kronometre Uygulaması
  Overloaded Metotların Gücü
  C# ile XMLQuery Örneği
  Rastgele Kod Üretimi
  Kontroller ile Çalışma
  Düzenli İfadeler Nedir?

DUYURULAR

F# Microsoft dil teknolojisinin en yeni üyesi.Common Lisp-Slime-Emacs tarzında etkileşimli,kıvrak,sonuçların anında görülebildiği ve yüksek performanslı bir betik dil olarak özetleyebiliriz bu yeni dili. devamı >>


Türk Telekom'dan yapılan yazılı açıklamada, Telekomünikasyon Kurumu'nun onayladığı yeni tariflerin, internet servis sağlayıcı şirketlerin maliyetlerini önemli oranlarda düşüreceği aktarıldı. devamı >>


COM İstemcileri İçin .NET Komponenti Hazırlamak | Asundinay.Com
C Sharp (C#) İçin Eklenmiş Makale
 Makale Adı  :  COM İstemcileri İçin .NET Komponenti Hazırlamak
 Yayın Tarihi :  12.08.2007 14:18:35 Ekleyen :  Kazım Aydın Okunma : 288

 

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. Assembly’lerin GAC’a 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 GAC’a 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 GAC’a 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.

GAC’a 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 IIS’in bir dizini olan WWWROOT’unm 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.(ASP’de 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.


 

Kaynak : csharpnedir.com


 

C Sharp (C#) İçin Eklenmiş Tüm Makaleler
C Sharp (C#) İçin En Son Eklenen 5 Makale
 Makale Adı  :  C#'da klasör işlemleri
 Yayın Tarihi :  11.04.2009 08:47:40 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C# ile diziyi tersine çevirme
 Yayın Tarihi :  27.11.2008 08:57:42 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  Çok Kullanılan Kontroller-1
 Yayın Tarihi :  05.11.2007 10:39:39 Ekleyen :  Kazım Aydın Makaleyi Oku  
 Makale Adı  :  C# ile Kronometre Uygulaması
 Yayın Tarihi :  09.10.2007 11:23:04 Ekleyen :  Zeliha Görmez Makaleyi Oku  
 Makale Adı  :  Overloaded Metotların Gücü
 Yayın Tarihi :  12.08.2007 16:05:03 Ekleyen :  Kazım Aydın Makaleyi Oku  

C/C++
  C ögreniyorum -8-
  C ögreniyorum -7-
  C ögreniyorum -6-
  C ögreniyorum -5-
  C ögreniyorum -4-
  C ögreniyorum -3-
  C ögreniyorum -2-
  C ögreniyorum -1-
  İlk C++ Programımız

JAVA
  Java ile Histogram Eşitleme
  JAVA İçinde Thread Kullanımı
  Serialization İşlemleri 2
  Serialization İşlemleri
  İlk Bakışta JSP
  Servletler ile Web Sayfaları
  Java ile Grafik Çizim
  Java, MySql Bağlantısı
  JBuilder ile Database

PHP
  php dersleri -1-
  php/access ile silme işlemi
  php ile access'e bağlanma - 2
  php ile access'e bağlanma - 1
  Döngü ve Diziler - BÖLÜM 5
  Döngü ve Diziler - BÖLÜM 4
  Döngü ve Diziler - BÖLÜM 3
  Döngü ve Diziler - BÖLÜM 2
  Döngü ve Diziler - BÖLÜM 1

İSTATİSTİKLER
  Toplam ziyaret :  24742
  Toplam üye sayısı :  1081
  Asp makale sayısı :  20
  Asp.Net makale sayısı :  54
  Php makale sayısı :  26
  C/C++ makale sayısı :  51
  C# makale sayısı :  29
  Java makale sayısı :  33
  Toplam makale saıysı :  213
Copyright asundinay® 2007 Her Hakki Saklidir
Tasarim & Programlama asundinay®