Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Sefer Algan
Sefer Algan
http://www.seferalgan.com
İletişme geçmek için tıklayın.
71 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler:  C# / VC#/.NET Sefer Algan
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Başlangıç
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 15.6.2003
Okunma Sayısı : 22144
Yorum Sayısı : 5     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 10.8.2022
Turhal Temizer
Mac OS/X Removing CUDA 10.8.2022
Burak Selim Şenyurt
Rust Pratikleri - Value Moved Here 10.8.2022
Burak Selim Şenyurt
Rust Pratikleri - State Tasarım Kalıbı 10.8.2022
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
COM İstemcileri İçin .NET Komponenti Hazırlamak
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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.

Makale:
COM İstemcileri İçin .NET Komponenti Hazırlamak C#, Visual C# ve .NET Sefer Algan
  • Yazılan Yorumlar
  • Yorum Yaz
ŞUB
7
2007
vışşş
ARA
17
2005
ahcanım benim biraz daha uğraş yaparsın...
ARA
12
2005
sizden bi ricam olacak. Ben oluşturduğum com nesnesine sizin yazdığınız kodla erişemeye kalknca şu hatayı alıyorum: Set assignment statements are no longer supported. Nedenini anlayamadım.Yardımcı olursanız sevinirim.Sizemail de attım..Tşk ederim...
ARA
12
2005
sizden bi ricam olacak. Ben oluşturduğum com nesnesine sizin yazdığınız kodla erişemeye kalknca şu hatayı alıyorum: Set assignment statements are no longer supported. Nedenini anlayamadım.Yardımcı olursanız sevinirim.Sizemail de attım..Tşk ederim...
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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