当前位置:  开发笔记 > 开发工具 > 正文

如何在.NET中加载插件?

如何解决《如何在.NET中加载插件?》经验,为你挑选了4个好方法。

我想提供一些在我的软件中创建动态可加载插件的方法.执行此操作的典型方法是使用LoadLibrary WinAPI函数加载DLL并调用GetProcAddress以获取指向该dll内的函数的指针.

我的问题是如何在C#/ .Net应用程序中动态加载插件?



1> Matt Hamilto..:

从.NET 3.5开始,有一种正式的,可以从.NET应用程序创建和加载插件的方法.它全部在System.AddIn命名空间中.有关详细信息,请查看MSDN上的这篇文章:加载项和扩展性



2> Zooba..:

以下代码片段(C#)构造从Base应用程序路径中的类库(*.dll)中找到的任何具体类的实例,并将它们存储在列表中.

using System.IO;
using System.Reflection;

List objects = new List();
DirectoryInfo dir = new DirectoryInfo(Application.StartupPath);

foreach (FileInfo file in dir.GetFiles("*.dll"))
{
    Assembly assembly = Assembly.LoadFrom(file.FullName);
    foreach (Type type in assembly.GetTypes())
    {
        if (type.IsSubclassOf(typeof(Base)) && type.IsAbstract == false)
        {
            Base b = type.InvokeMember(null,
                                       BindingFlags.CreateInstance,
                                       null, null, null) as Base;
            objects.Add(b);
        }
    }
}

编辑:Matt引用的类可能是.NET 3.5中更好的选择.



3> cdiggins..:

动态加载插件

有关如何动态加载.NET程序集的信息,请参阅此问题(以及我的答案).下面是一些用于加载创建AppDomain和加载程序集的代码.

var domain = AppDomain.CreateDomain("NewDomainName");
var pathToDll = @"C:\myDll.dll"; 
var t = typeof(TypeIWantToLoad);
var runnable = domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName) 
    as IRunnable;
if (runnable == null) throw new Exception("broke");
runnable.Run();

卸载插件

插件框架的典型要求是卸载插件.要卸载动态加载的程序集(例如插件和加载项),您必须卸载包含AppDomain.有关详细信息,请参阅有关卸载AppDomains的MSDN上的这篇文章.

使用WCF

有一个堆栈溢出问题和答案描述了如何使用Windows Communication Framework(WCF)来创建插件框架.

现有的插件框架

我知道两个插件框架:

Mono.Add-ins - 正如在另一个问题的答案中提到的那样.

托管外接程序框架(MAF) - 这是Matt在他的回答中提到的System.AddIn命名空间.

有些人将Managed Extensibility Framework(MEF)称为插件或插件框架,但事实并非如此.有关更多信息,请参阅此StackOverflow.com问题和此StackOverflow.com问题.



4> Patrik Svens..:

一个提示是将所有插件加载到自己的AppDomain中,因为运行的代码可能是恶意的.自己的AppDomain还可用于"过滤"您不想加载的程序集和类型.

AppDomain domain = AppDomain.CreateDomain("tempDomain");

并将程序集加载到应用程序域:

AssemblyName assemblyName = AssemblyName.GetAssemblyName(assemblyPath);
Assembly assembly = domain.Load(assemblyName);

要卸载应用程序域:

AppDomain.Unload(domain);

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有