2 ay önce çalıştığım yerde bir arge projesi için görevlendirilmiştim. Yapacağım iş “dinamik olarak windows servislerini yönetme” olarak adlandırılmıştı.Herbir servis için ayrı ayrı windows servisleri yazmaktansa, bir framework geliştirilecek, bu framework veritabanından eklenen dllleri ayrı ayrı threadlerde çalıştıracak, dlller ise kendi başına çalışmaya devam edeceklerdi.Bunun için gerekli olan en büyük iş dlli dinamik olarak yüklemek ve ilgili metotları çalıştırmaktı. Bu kapsamda yazmış olduğum kodu sizlerle yaplaşıyorum. Örnekte dinamik olarak sms göndereceğimiz bir sistem geliştiriyoruz.Dilerseniz koda geçelim:Örnek1:public object RunDynamicDLLMethod(string dllPath,string nameSpace,string className,string methodName,object[] parameters){// DLL dosyasını dinamik olarak assembly e yüklüyoruzSystem.Reflection.Assembly asm = System.Reflection.Assembly.LoadFile(dllPath);// Yüklediğimiz dll in içindeki, ihtiyacımız olan sıfını ı türetmemiz gerekecek (Veritabanim vt = new Veritabanim(); mantığını dinamik olarak yapıyoruz)object myInstance = asm.CreateInstance(nameSpace + “.” className);if(myInstance !=null){Type t = myInstance.GetType(); // Türettiğimiz dinamik classın tipini öğrenmemiz gerekiyor, çünkü içindeki methodları kullanacağızMethodInfo mInfo = t.GetMethod(methodName); // Tipini öğrendikten sonra bu tipe ait istediğimiz metodu belirliyoruz. MethodInfo methodlara ait bilgileri tutar, (ReturnType, Parameters….)object result = mInfo.Invoke(myInstance, parameters); // Sıra geldi bu metodu çağırmaya, MethodInfo nun Invoke fonksiyonunu kullanarak metoda bir istek yapacağız, Invoke kullanırken türettiğimiz örneği object ve metodun alacağı parametreleri object dizi şeklinde göndermemiz gerekiyorreturn result; // Invoke sonucunda dinamik dll deki metotdan gelen dönüş değerinin tipi object olacaktır.}else{return null;}}void Main(){// Fonksiyonumuza değerlermizi gönderiyoruz ve sonucu bir object e atıyoruzobject dynamicData = RunDynamicDLLMethod(“SMSEngine.dll”,”SMSEngine”,”SMS”,”SendSMS”,new object[] { “username”, “password”, “05781234569”, “dinamik olarak sms gonderiyorum”});if(dynamicData!=null){bool sendResult = Convert.ChangeType(dynamicData, dynamicData.GetType()); // Burada object değerini bool tipine convert ediyoruz, böylelikle gelen değer üzerinde karşılaştırma yapabileceğiz.if(sendResult)Console.Write(“SMS Gonderildi”);elseConsole.Write(“SMS Gonderilemedi”);}elseConsole.Write(“Hata oluştu”);}

Örnek 2:Mesela bir uygulamanız var ve lisans için ayrı bir dll kullanıyorsunuz. Fakat dll i hard olarak diskte tutmak istemiyorsunuz. (kırılır, çözülür…vsss)Bu kapsamda dlli projenize dinamik olarak yükletmeniz ve yukarıdaki adımları tekrarlamanız gerekecektir. Ama dll nerde? DLL i hard olarak tutmak istemiyorduk.Bunun için şöyle bir çözüm yapabilirsiniz: DLL internet ortamında tutup, program açıldığında download edip, dinamik olarak kullanabilir daha sonrada silebilirsiniz.Bu şekilde istemiş olduğunuz çözüm sağlanmış olacaktır.Umarım herkese faydalı olmuştur. Kahvenizin bol, kodunuzun bugsız olması dileği ile.