在运行时更改.dll

时间:2013-10-01 12:10:38

标签: c# .net dll

我有一个庞大的应用程序,我的解决方案的一个项目会生成报告。 我想在不构建项目的情况下添加新报告(更新报告),只需添加.dll个文件。我读到了AssemblyAppDomain,但我不知道为新报告添加新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;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

程序集通常会加载到AppDomain一次,加载后就无法卸载它们。

您可以创建一个新的AppDomain并将程序集加载到此中,当您释放它时,将卸载程序集。但是,这里需要注意的是,您不能直接在两个AppDomain之间进行通信,而是必须使用其他一些方法(例如远程处理)来编组。{/ p>

关于插件和插件无法加载的问题已经写了很多,谷歌快速搜索了这些:

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

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

希望这些能帮到你。

答案 1 :(得分:3)

如果您想编写类似插件的内容并且喜欢插件方法,那么您应该看看MEF http://msdn.microsoft.com/en/library/vstudio/dd460648.aspx

MEF允许您动态使用任何程序集,甚至将dll删除到文件夹中并从中构建MEF目录。

实际上是Visual Studio并在内部使用MEF来实现可扩展性(插件......)