Klasik ASP içinden .NET dll'lerine erişmek

Cenk’in yazmış olduğu blog’unda belirttiği gibi, Visual Studio 2008 Service Pack 1 ile birlikte, klasik ASP desteği tekrar gelmekte. Bunun en büyük nedeni, hala klasik ASP ile web uygulamaları geliştiriliyor olmasıdır. Ancak, .NET’in yaygınlığını ve kolay kullanılır olmasını da göz önüne alırsak, çok sık karşılaşılan bir senaryo, uygulamaların yavaş yavaş .NET’e taşınmasıdır. Burada da çok sık karşılaşılan durum, ASP.NET uygulamalarında kullanılan kütüphaneler yazılması ve bu kütüphanelerin klasik ASP uygulamaları içinden çağırılmasıdır. Bu yaklaşım son derece akılcı bir yaklaşımdır ve klasik ASP uygulamalarının ASP.NET’e çevirilmesi sırasında ciddi bir kolaylık sağlamaktadır.

 

.NET ile geliştirilmiş bir modüle, klasik ASP içinden erişmek istediğiniz zaman kullanmanız gereken bir araç vardır: Assembly Registration Tool (Regasm.exe). Aslında bu araç, .NET (managed) modüllerin “COM client”lar tarafından ulaşılmasını sağlamak için registry’ye bazı bilgiler yazmaktadır.

Şimdi küçük bir örnek üzerinde bu işlemleri yapalım. Örneğimizde VS.NET 2005 ile basit bir C# .NET 2.0 Class Library projesi oluşturacağız:

1) Visual Studio 2005’i açalım ve C# projelerinden yeni bir class library oluşturalım. Örnek projemizde isim olarak DotNetKutuphane seçtim.

Dikkat etmeniz gereken önemli bir nokta, ASP içinden dll’i çağırırken, namespace ve class isimlerine göre çağırıyor olmamızdır. Eğer namespace kullanmazsanız, sadece class ismine göre çağırım yapılmalıdır. Ancak birden fazla aynı isme sahip class’ınız olabileceği için namespace kullanmanızı tavsiye ederim.

2) Aşağıdaki örnek kodu yazalım:

using System;

namespace DotNetKutuphane

{

    public class Matematik

    {

        public int Toplam(int x, int y)

        {

            return x + y;

        }

  public int Carpim(int x, int y)

        {

            return x * y;

        }

    }

}

Yukarıdaki kod örneğinden kolaylıkla anlaşılacağı gibi Matematik isimli bir sınıf yaratıp iki sayının toplamı veya çarpımını hesaplayan metodlarımız olacaktır. Derlenecek DLL’i ASP içinden Server.CreateObject metodu ile çağırırken DotNetKutuphane.Matematik tanımını kullanacağız.

3) Projemizin AssemblyInfo.cs dosyasını açalım (Solution Explorer içinden Properties klasöründe yer almaktadır) ve [assembly: ComVisible(false)] satırını [assembly: ComVisible(true)] olarak değiştirelim. Bu sayede uygulamamızın COM client’lar tarafından erişilebilir olacağını belirtmiş oluyoruz.

4) Regasm.exe’yi kullanmadan hemen önce uygulamamızı strong name ile imzalamamız gerekmektedir. Bunun için VS.NET komut satırından sn.exe aracını kullanabilirsiniz. Ancak VS.NET 2005 ile birlikte artık bu imzalama işini VS.NET arabiriminden de yapabiliyorsunuz. Bunun için Solution Explorer penceresinde projeimizin ismi üzerine sağ klik yapıp properties’i seçmeliyiz. Karşımıza gelecek olan özellikler ekranında Signing’i seçerek “Sign the assembly”yi seçip strong name key oluşturmanız yeterli olacaktır.

5) Bu adımdan sonra artık uygulamamızı derleyebiliriz.

6) Uygulamamızı derledikten sonra VS.NET komut satırını açalım ve komut satırında, uygulamamızın derlendiği klasöre geçelim. DLL’imizin bulunduğu klasördeyken aşağıdaki komutu çalıştıralım (Derlediğimiz DLL’imizin isminin DotNetKutuphane.dll olduğunu varsayıyoruz):

regasm /codebase /tlb DotNetKutuphane.dll

Bu adımın sonucunda DLL’in olduğu klasörde TLB uzantılı type library dosyamızın da oluşması lazım. Bu komut ayrıca registry’ye DLL’e ulaşmamızı sağlayacak bilgileri de yazacaktır.

7) Artık ASP içinden DLL’imizi çağırabiliriz. Favori kod editörünüz ile aşağıdaki kodları bir ASP sayfasına yazın:

<%

    Dim Matematik, a, b

    Set Matematik = Server.CreateObject("DotNetKutuphane.Matematik")

    a = Matematik.Toplam(3, 5)

    b = Matematik.Carpim(3, 5)

    Response.Write("3 + 5 = " & a & "<br/>")

  Response.Write("3 * 5 = " & b & "<br/>")

%>

ASP sayfanızı çağırdığınız zaman beklendiği gibi aşağıdaki sonucu görmelisiniz:

3 + 5 = 8
3 * 5 = 15

Özetlemek gerekirse,.NET ile geliştirilmiş bir DLL’i aşağıdaki adımları kullanarak ASP içinden çağırabilirsiniz:

1) .NET Class Library’nizi geliştirin.

2) Uygulamanızın ComVisible olmasına dikkat edin.

3) Uygulamanızı sn.exe ya da VS.NET’i kullanarak imzalayın.

4) Regasm.exe ile DLL’inizi COM Wrapper olarak register edin.

5) ASP sayfanızdan Server.CreateObject(“Namespace.Class”) şeklinde çağırın.

Dikkat etmeniz gereken bir başka nokta, erişeceğiniz metodların public olarak işaretlenmiş olmasıdır.

--
AMB