2013-10-01 54 views
4

我有一个巨大的应用程序,我的解决方案的一个项目会生成报告。 我想添加新的报告(更新报告),而不建立我的项目,只需添加.dll文件。我读了约AssemblyAppDomain,但我不知道是否真的很好的方式为新报告添加新的DLL,以及如何在运行时更新旧报告? 这是我的例子,它需要我的第一个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; 
     } 
    } 
} 
+0

你的代码我的机器上工作的罚款。 – vendettamit

+0

这真的会有不同的结果吗?对我来说,它给2和2(应该是8)... –

+0

这可能是因为我用.net 4.5运行它,你使用的是哪个版本? – vendettamit

回答

3

如果你想要写类似的插件和喜欢的插件的方法,你应该在MEF http://msdn.microsoft.com/en/library/vstudio/dd460648.aspx看看

MEF允许你动态地使用任何组件,甚至下降dll文件到文件夹中,并建立一个MEF目录出来了。

实际上Visual Studio和使用MEF内部的extensiblility(插件...)

+0

我知道MEF会进入.net 4.0,你认为它将如何与3.5版本的.net一起使用? –

+0

是的,它应该是可能的,如果你下载预览版9例如自己编译它。虽然没有正式发布 – MichaC

3

组件一般都加载到AppDomain一次,你不能卸载它们一旦被加载。

您可以创建一个新的AppDomain并将您的装配加载到此中,并且当您释放时,装配将被卸载。然而,这里的注意事项是你不能直接沟通两个AppDomain你必须使用其他方法如远程处理两个元帅之间。

有许多人在插件方面,使插件卸载的,在这么多写,一个快速谷歌搜索呈现这些:

http://www.brad-smith.info/blog/archives/500

http://adrianvintu.com/blogengine/post/Unloadable-plugins.aspx

希望这些将帮助你。