次の方法で共有


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

Comments

  • Anonymous
    December 27, 2009
    Örneği VS08'de hazırlayıp target framework'ü 3.5 olarak dediklerinizi adım adım yapıp derledim fakat ASP'den erişmeye çalıştığımda aşağıdaki hatayı alıyorum.Hata Tipi:Server nesnesi, ASP 0177 (0x800401F3)Geçersiz sınıf dizesiAşağıdaki adresteki reg hack'ide yaptım fakat sonuç alamadım.http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=294241
  • Anonymous
    December 27, 2009
    HKEY_LOCAL_USRSOFTWAREClassesDotNetKutuphane.Matematikanahtarına IUSR kullanıcısına okuma hakkı verip IISRESET yapınca düzeliyor.Verdiğin bilgiler için teşekkür ederim.msn@enginmutlu.com
  • Anonymous
    January 04, 2010
    Merhaba,geç yanıtım için kusura bakmayın. Zaten siz çözümü bulmuş ve burada paylaşmışsınız. Çözümü paylaştığınız için de ayrıca teşekkür ederim.Permission hatalarından şüphelinildiği zaman kullanılacak güzel bir araçtan bahsetmek istiyorum. Aracın adı "Process Monitor".Process Monitor ile gerçek zamanlı olarak file system ve registry erişimlerini takip edebilirsiniz. Permission problemlerinde, Process Monitor uygulamasını çalıştırıp, sorunu tekrar oluşturup Process Monitor'ü durdurup oluşan logları inceleyebilirsiniz. Özellikle "Access Denied" hatalarında, hang uygulamanın, hangi kullanıcı ile nereye ulaşmaya çalışırken ve ne yaparken yeterli hakları olmadığını belirleyebilir ve sorunu tespit edebilirsiniz.Process Monitor uygulamasını aşağıdaki linkten indirebilirsiniz:http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx--AMB
  • Anonymous
    March 24, 2010
    Allah razı olsun dostum senden. hızır gibi imdadıma yetiştin. işin içinden çıkamıyordum bir türlü.