C#動態(tài)加載程序集問題 高分求解

C#動態(tài)加載程序集問題 高分求解

我先說下你想要的結(jié)果,你把Assembly.LoadFrom換成Assembly.LoadFile即可。另外,你既然能夠在你的應(yīng)用中使用Assembly.LoadFrom這樣的方法,那test1.dll他們的路徑就是已知的了,何必還要通過反射程序集內(nèi)部方法來獲取它的Location呢?如果你是將test1.dll注冊到了全局環(huán)境中,那么我建議你不要使用LoadFrom和LoadFile,改用Load方法:將test1和test2通過版本號或者公鑰(PublicKey百科)加以區(qū)別,然后用Load方法調(diào)用。

調(diào)用參數(shù)類似于:“程序集名,Version=版本1,culture=區(qū)域信息1,PublicKeyToken=公鑰1”,這是微軟標(biāo)準(zhǔn)的做法。

關(guān)于動態(tài)加載程序集的問題

應(yīng)該用到反射引入System.Reflection命名空間用Assembly.Load(程序集文件的**路徑)方法加載程序集,再搜索實現(xiàn)了指定接口的類,用Activator.CreateInstance(Type t)方法創(chuàng)建其實例即可,下面是一個例子(源自我自己的一段代碼):/// <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方法返回的就是一個實現(xiàn)了ICodeProvider接口的數(shù)組,然后就可以選擇其中一個調(diào)用其方法

C#動態(tài)加載dll 時程序集的卸載問題

你提到,當(dāng)卸載域的時候“另一個線程還在執(zhí)行這個dll里面的方法”,那么這個方法的調(diào)用方應(yīng)該在**卸載的域之外,這樣:通過反射方法運行的代碼在執(zhí)行的域中(即主程序的域),這種情況下在執(zhí)行域中同樣加載了目標(biāo)程序集(因此文件被占用),與要卸載的域無關(guān)。如果目標(biāo)程序集是可執(zhí)行程序,則可以令新建的域執(zhí)行該代碼,此時,在代碼執(zhí)行中突然卸載域,會從執(zhí)行線程上引發(fā)AppDomainUnloadException異常。

跨應(yīng)用程序域訪問不是一種好的設(shè)計思路。

C#請問反射的主要作用是什么

1.?

c#反射動態(tài)加載EXE程序問題

Thu

sqlhelper 的類型初始值設(shè)定項引發(fā)異常

項目采用了三層架構(gòu)和工廠模式,并借鑒了PetShop的架構(gòu),因為這個項目也是采用分布式的數(shù)據(jù)庫,目前只有三個數(shù)據(jù)庫,主要出于提高訪問性能考慮。原來是按照網(wǎng)上對PetShop的介紹來給各項目添加引用的。

1、Web 引用 BLL。

2、BLL 引用 IDAL,Model,使用DALFactory創(chuàng)建實例。 3、IDAL 引用 Model。 4、Model 無引用。 5、DALFactory 引用IDAL,通過讀取web.config里設(shè)置的程序集,加載類的實例,返回給BLL使用。

6、SQLServerDAL 引用 Model和IDAL,被DALFactory加載的程序集,實現(xiàn)接口里的方法。 問題就出在這里了。頂! 按照PetShop的架構(gòu),是DALFactory程序集里通過反射創(chuàng)建針對特定數(shù)據(jù)訪問層里的對應(yīng)類實例,這樣BLL調(diào)用接口時就知道調(diào)用這個對應(yīng)類實例里的實現(xiàn)方法。

而反射動態(tài)加載程序集是通過這種方法 Assembly.Load(\”程序集\”).CreateInstance(\”命名空間.類\”),其中的“程序集”讀取的是Web層bin文件夾下對應(yīng)的dll,即反射加載的程序集dll在Web層的bin文件夾必須有,不然就會出現(xiàn)如題的錯誤。問題解決了~^_^ 出現(xiàn)這種錯誤的另兩種情況,這也是在網(wǎng)上看到的,一起寫下來。 一、Web.config配置錯誤。

在DALFactory程序集里的DataAccess類里,通過 private static readonly string path = ConfigurationManager.AppSettings[\”WebDAL\”]; 來獲得程序集的名稱的。 在Web.config里我的配置如下: <appSettings> <add key=\”WebDAL\” value=\”PDMS.SQLServerDAL\”/> </appSettings> 二、程序集名稱和默認(rèn)命名空間錯誤。 在各個程序集右鍵–屬性,看看程序集名稱和默認(rèn)命名空間有沒有寫錯。