[Çözüldü] - C# Runtime Anında Assembly.Load Sorunsalı
-
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. } }
-
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.
-
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.
-
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.
-
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.