首页 > 编程语言 >C# 简单反射加载 DLL 实例

C# 简单反射加载 DLL 实例

时间:2024-02-27 20:22:19浏览次数:28  
标签:return baseType C# Type DLL IDev type 加载

// 反射判断是否位某个类型

public bool IsSubclassOf(this Type type, Type baseType)
{
    // 如果type不是null并且baseType是一个类(非接口)
    if (type != null && baseType.IsClass)
    {
        return type.IsSubclassOf(baseType);
    }

    // 或者如果baseType是接口,并且type实现了该接口
    return baseType.IsInterface && type.GetInterfaces().Contains(baseType);
}

// 反射加载 DLL

// 加载插件方法 处理方法
public bool LoadPlugin()
{
    DirectoryInfo dir = new DirectoryInfo(DirName);
    if (!dir.Exists)
    {
        return false;
    }
    foreach (FileInfo fileInfo in dir.GetFiles("*.dll"))
    {
        try
        {
            byte[] buffer = File.ReadAllBytes(fileInfo.FullName);
            Assembly asm = Assembly.Load(buffer); // 这样不会占用文件
            Type[] types = asm.GetTypes();
            foreach (Type tp in types)
            {
                if (tp.GetInterface(typeof(IDev).Name) != null) // 如果是 IDev 接口类型
                {
                    PluginList.Add(new ModPlugin(Activator.CreateInstance(tp) as IDev));
                }
            }

            return true;
        }
        catch
        {
            continue;
        }
    }

    return true;
}

标签:return,baseType,C#,Type,DLL,IDev,type,加载
From: https://www.cnblogs.com/huvjie/p/18037958

相关文章

  • spring boot 中使用MybatisPlus的自动填充createTime和updateTime
    首先需要在实体类的字段上加上注解,并且将类型更改为LocalDateTime@TableField(fill=FieldFill.INSERT)@JsonInclude(value=JsonInclude.Include.NON_NULL)@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss")privateLocalDateTimecreateTime;@TableFie......
  • AT_arc117_c [ARC117C] Tricolor Pyramid 题解
    [ARC117C]TricolorPyramid博客阅读体验(也许)更佳题意给一个金字塔的底部颜色组成和生长规律,问顶部的颜色是什么。分析试几次就可以很容易得到的一种构造:令颜色B为\(0\),W为\(1\),R为\(2\)。设左右两个方块的颜色分别为\(col_l\)和\(col_r\),则生长规则可以描......
  • [ARC121B] RGB Matching 题解
    题意有\(2N\)个物品,每个物品有可爱度\(a_i\)和颜色\(c_i\),将其两两配对。假设物体\(i\)和\(j\)配对,则\(c_i\neqc_j\),则会增加\(|a_i-a_j|\)的不满意度,求最小的不满意度。分析这道题可以贪心解决。我们尽量让每一对物品颜色相同,令每种颜色的总个数为\(cnt_c\),......
  • AT_abc270_g [ABC270G] Sequence in mod P 题解
    [ABC270G]SequenceinmodP博客阅读可能体验更佳题意给出递推式如下,求最小的使\(X_i=G\)成立的\(i\)。\[X_i=\begin{cases}S&i=0\\(A\timesX_{i-1}+B)\bmodp&i\ge1\end{cases}\]分析这里分几种情况来分析:当\(A=0\)时,\(X_i\)要么等于\(S\),要么等于\(B\),直......
  • CF1928C Physical Education Lesson 题解
    洛谷传送门原题传送门题意一种上下波动的数组,给出所在的位置\(n\)和对应的数字\(x\),求出有几种数组满足条件。令\(k\)为最大值,则数组长成这样子:\[1,2,3,\cdots,k-1,k,k-1,k-2,\cdots,2,1,2,3,\cdots\]如图,每\(2(k-1)\)就循环一次。分析因为每\(2(k-1)\)......
  • CF1477A Nezzar and Board 题解
    题意给出数列\(S=\{a_i\}\)和整数\(k\),求是否能通过下面的操作使得\(k\inS\)?操作:选取\(x,y\inS\),将\(2x-y\)加入\(S\)中。分析观察操作可以发现,\(2x-y\)实际上就是数轴上\(y\)关于\(x\)的对称点,因此这个操作只与\(x\)和\(y\)在数轴上的相对位置有关,与......
  • Qt QVector和vector以及QMap和map的遍历性能对比
    使用Qt中的容器给C++开发带来很大的便利,而且QVector和QMap等容器扩展的一些成员函数也是很方便的。但是Qt的这些容器和STL库的容器比,效率到底怎么样?我就写了几个简单的遍历的例子,测试了QVector、vector等容器的那些方法效率更高。测试环境:系统:windows10编译器:MingGWmingw......
  • [ABC342D] Square Pair 题解
    洛谷传送门原题传送门题意给出一个数列\(A\),求出满足\(A_iA_j\)为完全平方数的无序数对\((i,j)\)的个数。分析容易想到(但是我在昨晚没想到,可以原地AFO了),对于每个数,如果是\(0\)的话可以直接统计答案(记录\(0\)的个数\(cnt\),最后\(ans\leftarrowans+cnt(n-cnt)+\f......
  • [ABC342E] Last Train 题解
    洛谷传送门原题传送门题意给出一些由\((l,d,k,c,A,B)\)描述的列车,表示每当时间为\(l,l+d,l+2d,\cdots,l+(k-1)d\)时有一半列车从\(A\)出发,经过\(c\)的时间到达\(B\)。问如果从站点\(i,i\in(0,n)\)出发要去站点\(n\),最晚什么时候到达站点\(i\)可以去到站点\(n\)......
  • [ABC342C] Many Replacement 题解
    洛谷传送门原题传送门题意给出由小写字母初始字符串,每次操作将字符串中所有为\(c\)的字符改为\(d\)。输出最终的字符串。分析很明显只需要开一个\(fa\)数组,其中\(fa[i]=j\)表示字母\(i\)被改为了\(j\)。对于每次操作只需要遍历\(26\)个字母,将\(fa[i]=c\)的那些......