folder Tahribat.com Forumları
linefolder C#, Asp.Net, .Net Core
linefolder [Çözüldü] - C# Runtime Anında Assembly.Load Sorunsalı



[Çözüldü] - C# Runtime Anında Assembly.Load Sorunsalı

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Muaddib
    Muaddib's avatar
    Kayıt Tarihi: 07/Haziran/2011
    Erkek

    Merhaba sevgili dostlar, umarım herkes iyidir. Bir konuda takıldım ve işin içinden de çıkamadım.

    Runtime anında daha önceden oluşturduğum bir class library (dll) yi load edip icerisindeki metodu calistiriyorum. Buraya kadar sıkıntı yok. Sorun şu noktada başlıyor ; 

    Library'e framework disi üçüncü parti bir referans eklediğimde ve kodu compile ettiğimde çıktısıs benim.dll ve diğer.dll seklinde oluyor. benim.dll'i runtime'da cagirdiğimda haliyle diğer.dll'i bulamadım diyor. Bu noktada benim.dll'i tüm gereksinimleri ile yani diğer.dll ve varsa baska referansları ile runtime'da nasıl load edebiliri m?

     class Program
        {
            
            static void Main(string[] args)
            {
                var MyDll = @"C:\MyFolder\SampleLibrary.dll";
                var MyAssembly = Assembly.LoadFile(MyDll);
                Type CompileType = MyAssembly.GetType("NameSpace.Class");//namespace ve class yazılır
                MethodInfo Metod2 = CompileType.GetMethod("Metod");//calistirilacak metod yazilir.
                var sonuc2 = Metod2.Invoke(null, null);//metod calisir sonucu object doner.
            }
    
        }

     

    Muaddib tarafından 28/Eyl/17 11:26 tarihinde düzenlenmiştir

    sic mundus creatus est
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    tam anlayamadim sorununu, dll i gösteremedin mi yoksa öyle bir dll vermek mi istemiyorsun. yani diger.dll i bulamiyor diyorsun ama bu dll nerede? eger normal exe ya da dll üzerinden cagiriyorsan ayni klasörde olmasi olmasi kafi hocam. Ama bazi durumlarda ilgili assembly nin de load edilmis olmasi gerekiyor. 

    O yüzden tüm bagimli dll leri de load etmen gerekiyor.

     

    Assembly.LoadFile("diger dll");

     

    dll yüklemeleri bittikten sonra

     

    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

    buradan dönen degerlere bak hocam, iki dll de burada var mi diye.. Ayrica Assembly.LoadFile yerine AppDomain.CurrentDomain.Load(...) u da deneyebilirsin olmazsa (iki dll icin de).

    Eger bu dll ler explorer tarafindan cagriliyorsa dll in baktigi yer farkli bir dizin olabilir. 


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Muaddib
    Muaddib's avatar
    Kayıt Tarihi: 07/Haziran/2011
    Erkek
    unbalanced bunu yazdı

    tam anlayamadim sorununu, dll i gösteremedin mi yoksa öyle bir dll vermek mi istemiyorsun. yani diger.dll i bulamiyor diyorsun ama bu dll nerede? eger normal exe ya da dll üzerinden cagiriyorsan ayni klasörde olmasi olmasi kafi hocam. Ama bazi durumlarda ilgili assembly nin de load edilmis olmasi gerekiyor. 

    O yüzden tüm bagimli dll leri de load etmen gerekiyor.

     

    Assembly.LoadFile("diger dll");

     

    dll yüklemeleri bittikten sonra

     

    Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

    buradan dönen degerlere bak hocam, iki dll de burada var mi diye.. Ayrica Assembly.LoadFile yerine AppDomain.CurrentDomain.Load(...) u da deneyebilirsin olmazsa (iki dll icin de).

    Eger bu dll ler explorer tarafindan cagriliyorsa dll in baktigi yer farkli bir dizin olabilir. 

    Yotrumun için teşekkür ederim hocam sorunu çözdüm :)

    ClassLibray'de kullandığım referansları ortak bir path'e koydum. Class librarynin özelliklerindeki refferance pathe bu dizini verdim ve projeye referansları dahil ettim.

    ClassLibrary (DLL)'i load edeceğim projeyede aynı path'i referans path olarak ekleyip bu projeyede aynı dll'leri referans olarak ekledim.

     

    Sonrasında benim dll sorunsuz bir şekilde load edildi ve 3rd referans ile string dönen metod çalıştı ve sonucu aldım.


    sic mundus creatus est
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    tam anlamadim hocam neden referanslari bu sekilde verdigini, bunu yapmadan da halledebilirdin aslinda. Ben gui tabanli plugin manager yazdim c# ile (yazana kadar canim cikti), orada otomatik olarak dll leri resolve ediyorum ve daha önce GAC a yüklenmisse tekrar yükletmiyor. Bunun icin .Net in sundugu 2 teknoloji var MAF ve MEF. Bunlari birlestirerek yaptik. Bundan sonra ayni dll lleri kullanan pluginler yüklendiginde, bagimli dll leri daha önce yüklenmisse tekrar yüklemiyor, yüklenmemisse onlari yüklüyor. Hepsi signed dll oldugu icin de farkli versiyonlari da yüklettiriyoruz. Yani biri digerdll v1.0 i kullaniyor, diger plugin digerdll v1.2 yi kullaniyor olsa da iki dll i de yüklüyoruz ve pluginler kendine ait dll leri kullaniyor (bu isi mef cözüyor, sanirim farkli appdomainlere yüklüyor). Baya karisik bir konu, zaten bu konuyla ilgili örnek acikcasi bulamadim, herkes sadece senin gibi dll fonksiyonlarini cagirmis ancak bize gui tabanli bir plugin sistemi lazimdi.  

    Merak edenler icin ilk asamalarinda cektigim bir resmi ekleyeyim (simdi iste olmadigim icin yenisini ekleyemedim)

     

    Sol allta pluginler var, bir pluginden birden fazla instance olusturulabiliyor ve instance secildiginde sag da ilgili pluginin formu beliriyor ve tüm pluginler aslinda birer dll. Ayni zamanda bu pluginlerin bir de windows servisleri var. Bizim konsol uygulamamizin görevi bu pluginleri ve onlarin bagimliliklarini yükleyerek göstermek ve pluginin servisini kontrol etmek.


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Muaddib
    Muaddib's avatar
    Kayıt Tarihi: 07/Haziran/2011
    Erkek
    unbalanced bunu yazdı

    tam anlamadim hocam neden referanslari bu sekilde verdigini, bunu yapmadan da halledebilirdin aslinda. Ben gui tabanli plugin manager yazdim c# ile (yazana kadar canim cikti), orada otomatik olarak dll leri resolve ediyorum ve daha önce GAC a yüklenmisse tekrar yükletmiyor. Bunun icin .Net in sundugu 2 teknoloji var MAF ve MEF. Bunlari birlestirerek yaptik. Bundan sonra ayni dll lleri kullanan pluginler yüklendiginde, bagimli dll leri daha önce yüklenmisse tekrar yüklemiyor, yüklenmemisse onlari yüklüyor. Hepsi signed dll oldugu icin de farkli versiyonlari da yüklettiriyoruz. Yani biri digerdll v1.0 i kullaniyor, diger plugin digerdll v1.2 yi kullaniyor olsa da iki dll i de yüklüyoruz ve pluginler kendine ait dll leri kullaniyor (bu isi mef cözüyor, sanirim farkli appdomainlere yüklüyor). Baya karisik bir konu, zaten bu konuyla ilgili örnek acikcasi bulamadim, herkes sadece senin gibi dll fonksiyonlarini cagirmis ancak bize gui tabanli bir plugin sistemi lazimdi.  

    Merak edenler icin ilk asamalarinda cektigim bir resmi ekleyeyim (simdi iste olmadigim icin yenisini ekleyemedim)

     

    Sol allta pluginler var, bir pluginden birden fazla instance olusturulabiliyor ve instance secildiginde sag da ilgili pluginin formu beliriyor ve tüm pluginler aslinda birer dll. Ayni zamanda bu pluginlerin bir de windows servisleri var. Bizim konsol uygulamamizin görevi bu pluginleri ve onlarin bagimliliklarini yükleyerek göstermek ve pluginin servisini kontrol etmek.

    hocam aciklamalar icin cok teşekkür ederim. Zahmet verdim. Ufak capli birşeyler yapip durumu hallettim. 


    sic mundus creatus est
Toplam Hit: 1138 Toplam Mesaj: 5
c# runtime compile c# load assembly