C#動(dòng)態(tài)加載程序集問(wèn)題 高分求解
C#動(dòng)態(tài)加載程序集問(wèn)題 高分求解
我先說(shuō)下你想要的結(jié)果,你把Assembly.LoadFrom換成Assembly.LoadFile即可。另外,你既然能夠在你的應(yīng)用中使用Assembly.LoadFrom這樣的方法,那test1.dll他們的路徑就是已知的了,何必還要通過(guò)反射程序集內(nèi)部方法來(lái)獲取它的Location呢?如果你是將test1.dll注冊(cè)到了全局環(huán)境中,那么我建議你不要使用LoadFrom和LoadFile,改用Load方法:將test1和test2通過(guò)版本號(hào)或者公鑰(PublicKey百科)加以區(qū)別,然后用Load方法調(diào)用。
調(diào)用參數(shù)類(lèi)似于:“程序集名,Version=版本1,culture=區(qū)域信息1,PublicKeyToken=公鑰1”,這是微軟標(biāo)準(zhǔn)的做法。
關(guān)于動(dòng)態(tài)加載程序集的問(wèn)題
應(yīng)該用到反射引入System.Reflection命名空間用Assembly.Load(程序集文件的**路徑)方法加載程序集,再搜索實(shí)現(xiàn)了指定接口的類(lèi),用Activator.CreateInstance(Type t)方法創(chuàng)建其實(shí)例即可,下面是一個(gè)例子(源自我自己的一段代碼):/// <summary>加載指定DLL文件里的插件</summary>/// <param name=\”path\”>DLL文件文件路徑(**路徑)</param>public static ICodeProvider[] Load(string path){ List<ICodeProvider> Res = new List<ICodeProvider>(); try { Assembly a** = Assembly.LoadFile(path); foreach (Module Modules in a**.GetModules(false)) { foreach (System.Type Type in Modules.GetTypes()) { foreach (System.Type Iface in Type.FindInterfaces(find,typeof(ICodeProvider).Name)) { Res.Add((ICodeProvider)Activator.CreateInstance(Type)); } } } } catch (Exception ex) { } return Res.ToArray(); }bool find(System.Type m, object filtercriteria){ return (m.Name == filtercriteria.ToString()); }Load方法返回的就是一個(gè)實(shí)現(xiàn)了ICodeProvider接口的數(shù)組,然后就可以選擇其中一個(gè)調(diào)用其方法
C#動(dòng)態(tài)加載dll 時(shí)程序集的卸載問(wèn)題
你提到,當(dāng)卸載域的時(shí)候“另一個(gè)線程還在執(zhí)行這個(gè)dll里面的方法”,那么這個(gè)方法的調(diào)用方應(yīng)該在**卸載的域之外,這樣:通過(guò)反射方法運(yùn)行的代碼在執(zhí)行的域中(即主程序的域),這種情況下在執(zhí)行域中同樣加載了目標(biāo)程序集(因此文件被占用),與要卸載的域無(wú)關(guān)。如果目標(biāo)程序集是可執(zhí)行程序,則可以令新建的域執(zhí)行該代碼,此時(shí),在代碼執(zhí)行中突然卸載域,會(huì)從執(zhí)行線程上引發(fā)AppDomainUnloadException異常。
跨應(yīng)用程序域訪問(wèn)不是一種好的設(shè)計(jì)思路。
C#請(qǐng)問(wèn)反射的主要作用是什么
1.?
c#反射動(dòng)態(tài)加載EXE程序問(wèn)題
Thu
sqlhelper 的類(lèi)型初始值設(shè)定項(xiàng)引發(fā)異常
項(xiàng)目采用了三層架構(gòu)和工廠模式,并借鑒了PetShop的架構(gòu),因?yàn)檫@個(gè)項(xiàng)目也是采用分布式的數(shù)據(jù)庫(kù),目前只有三個(gè)數(shù)據(jù)庫(kù),主要出于提高訪問(wèn)性能考慮。原來(lái)是按照網(wǎng)上對(duì)PetShop的介紹來(lái)給各項(xiàng)目添加引用的。
1、Web 引用 BLL。
2、BLL 引用 IDAL,Model,使用DALFactory創(chuàng)建實(shí)例。 3、IDAL 引用 Model。 4、Model 無(wú)引用。 5、DALFactory 引用IDAL,通過(guò)讀取web.config里設(shè)置的程序集,加載類(lèi)的實(shí)例,返回給BLL使用。
6、SQLServerDAL 引用 Model和IDAL,被DALFactory加載的程序集,實(shí)現(xiàn)接口里的方法。 問(wèn)題就出在這里了。頂! 按照PetShop的架構(gòu),是DALFactory程序集里通過(guò)反射創(chuàng)建針對(duì)特定數(shù)據(jù)訪問(wèn)層里的對(duì)應(yīng)類(lèi)實(shí)例,這樣BLL調(diào)用接口時(shí)就知道調(diào)用這個(gè)對(duì)應(yīng)類(lèi)實(shí)例里的實(shí)現(xiàn)方法。
而反射動(dòng)態(tài)加載程序集是通過(guò)這種方法 Assembly.Load(\”程序集\”).CreateInstance(\”命名空間.類(lèi)\”),其中的“程序集”讀取的是Web層bin文件夾下對(duì)應(yīng)的dll,即反射加載的程序集dll在Web層的bin文件夾必須有,不然就會(huì)出現(xiàn)如題的錯(cuò)誤。問(wèn)題解決了~^_^ 出現(xiàn)這種錯(cuò)誤的另兩種情況,這也是在網(wǎng)上看到的,一起寫(xiě)下來(lái)。 一、Web.config配置錯(cuò)誤。
在DALFactory程序集里的DataAccess類(lèi)里,通過(guò) private static readonly string path = ConfigurationManager.AppSettings[\”WebDAL\”]; 來(lái)獲得程序集的名稱(chēng)的。 在Web.config里我的配置如下: <appSettings> <add key=\”WebDAL\” value=\”P(pán)DMS.SQLServerDAL\”/> </appSettings> 二、程序集名稱(chēng)和默認(rèn)命名空間錯(cuò)誤。 在各個(gè)程序集右鍵–屬性,看看程序集名稱(chēng)和默認(rèn)命名空間有沒(méi)有寫(xiě)錯(cuò)。