在运行时更改.dll
我有一个庞大的应用程序,我的解决方案的一个项目报告。 我想在不构建项目的情况下添加新报告(更新报告),只需添加.dll
文件。 我读到了关于Assembly
和AppDomain
,但我不知道为新报告添加新的dll以及如何在运行时更新旧报告真的很好吗? 这是我的例子,它需要我的第一个dll,但第二次没有。 第一个dll – 总和,秒 – 扣除。
static void Main(string[] args) { try { //first domain AppDomain domain = AppDomain.CreateDomain("MyDomain"); AssemblyDll asb1 = new AssemblyDll(); Console.WriteLine(asb1.AssemblyMethod(1)); AppDomain.Unload(domain); Console.ReadKey(); //second domain AppDomain newDomain = AppDomain.CreateDomain("myNewDomain"); AssemblyDll asb2 = new AssemblyDll(); Console.WriteLine(asb2.AssemblyMethod(2)); AppDomain.Unload(newDomain); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } public class AssemblyDll { public string AssemblyMethod(int version) { //loading .dll Assembly assembly = Assembly.LoadFrom(@"../../../../Assembly/DynamicDLL" + version + ".dll"); Type type = assembly.GetType("DynamicDLL.Dynamic"); object instance = Activator.CreateInstance(type); MethodInfo[] methods = type.GetMethods(); //invoke method object result = methods[0].Invoke(instance, new object[] { 5, 3 }); return result.ToString(); } }
我的.dll文件来自:
namespace DynamicDLL { public class Dynamic { public int DynamicMethod(int a, int b) { return a + b; //return a - b; } } }
如果你想编写像插件这样的东西,比如插件方法,你应该看看MEF http://msdn.microsoft.com/en/library/vstudio/dd460648.aspx
MEF允许您动态使用任何程序集,甚至将dll删除到文件夹中,并从中构建MEF目录。
实际上是Visual Studio并在内部使用MEF来实现可扩展性(插件……)
程序集通常一次加载到AppDomain
,一旦加载就无法卸载它们。
您可以创建一个新的AppDomain
并将程序集加载到此中,当您释放它时,将卸载程序集。 但是这里需要注意的是,你不能直接在两个AppDomain
之间进行通信,你必须使用其他一些方法(例如远程处理)来编组。
在插件和插件无法加载方面有很多关于这方面的文章,快速谷歌搜索提出了这些:
http://www.brad-smith.info/blog/archives/500
http://adrianvintu.com/blogengine/post/Unloadable-plugins.aspx
希望这些能帮到你。