在运行时更改 .dll

5
我有一个庞大的应用程序,其中解决方案的一个项目是生成报告。我想在不构建我的项目的情况下添加新报告(更新报告),只需添加.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;
        }
    }
}

你的代码在我的电脑上运行良好。 - vendettamit
它真的会给出不同的结果吗?对我来说,它给出的是2和2(应该是8)... - Nail Shakirov
可能是因为我使用了.NET 4.5运行它,你用的是哪个版本? - vendettamit
2个回答

3

装配件通常只能加载到一个 AppDomain 中,一旦加载就不能卸载。

你可以创建一个新的 AppDomain 并将你的装配件加载到其中,当你释放它时,装配件将被卸载。然而这里的警告是你不能直接在两个 AppDomain 之间通信,你必须使用其他方法(如远程处理)在两者之间进行调用。

关于插件和如何使插件可卸载已经有很多文章介绍,快速搜索谷歌可以找到以下文章:

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

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

希望这些对你有所帮助。


3
如果你想编写类似插件的东西,并且喜欢插件方法,那么你应该看一下MEF http://msdn.microsoft.com/en/library/vstudio/dd460648.aspx
MEF允许你动态地使用任何程序集,甚至可以将dll文件放入一个文件夹中并构建一个MEF目录。
实际上,Visual Studio内部使用MEF来进行可扩展性(插件...)。

我知道MEF适用于.NET 4.0,你认为它能够在.NET 3.5版本中顺利运行吗? - Nail Shakirov
是的,如果您下载了例如预览版9并自行编译,则应该是可能的。但是目前还没有官方发布。 - MichaC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接