在.NET的无限宇宙中,动态加载dll似乎一直是操控代码生生不息的魔杖。今天,我将与您探讨如何通过AntSK 0.2.1 版本灵活运用dll,将Function Call的强大功能插拔自如地融入项目之中,我们走入插件化开发的全新篇章。

新版本简介

AntSK,这个曾被我们广泛探讨过的Semantic Kernel项目,这次再度带来惊喜。在早先版本我们已经见识了其实现Function Call的威力。今日,我们有幸见证其升级再进化,0.2.1 版本究竟有何过人之处?答案就是:“动态加载dll”,这一核心玄机助您将代码实现插件化,不再拘泥于单一的AntSK平台编写,带来更加灵活的扩展性。

核心编程揭秘

要想细致品味动态加载dll的精妙,首先要解开的锁就是“约定”。AntSK要求插件明晰其身份,一段标明“AntSK”特性的代码如同通行证,使得函数得以插入AntSK的世界。

public class TestFunctionImport
{
/// <summary>
/// 获取名称
/// </summary>
/// <returns>返回名称</returns>
[Description("AntSK")]
public string GetName()
{
return $"""
我的名字是AntSK,
我的作者是许泽宇
我是一个AI 知识库/智能体项目
""";
}
}

接下来,动态加载这块宝藏怎能轻易让人得逞?我们需要通过AssemblyLoadContext这位严厉的守门人,创建一个隔离的上下文,一步步引领我们:

var loadContext = new AssemblyLoadContext("AntSKLoadContext", true);
public void FuncLoad(string pluginPath)
{
try
{
if (File.Exists(pluginPath))
{
string directory = Path.GetDirectoryName(pluginPath);
string fileName = Path.GetFileName(pluginPath);
var resolver = new AssemblyDependencyResolver(directory); // Create a custom AssemblyLoadContext loadContext.Resolving += (context, assemblyName) =>
{
string assemblyPath = resolver.ResolveAssemblyToPath(assemblyName);
if (assemblyPath != null)
{
return context.LoadFromAssemblyPath(assemblyPath);
}
return null;
};
// Load your assembly
Assembly pluginAssembly = loadContext.LoadFromAssemblyPath(pluginPath);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + " ---- " + ex.StackTrace);
}
}

我们是如何评判“AntSK插件”芳容?以下搜寻被特性标记的方法:

publicvoid SearchMarkedMethods()
{
var markedMethods = new List<MethodInfo>(); _methodCache.Clear();
_methodInfos.Clear(); foreach (var assembly in _assemblies)
{
// 从缓存中获取标记了ActionAttribute的方法
foreach (var type in assembly.GetTypes())
{
markedMethods.AddRange(type.GetMethods().Where(m =>
{
DescriptionAttribute da = (DescriptionAttribute)m.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
return da != null && da.Description == "AntSK";
}));
}
} //动态加载部分
var loadedAssemblies = loadContext.Assemblies.ToList();
foreach (var assembly in loadedAssemblies)
{
// 从缓存中获取标记了ActionAttribute的方法
foreach (var type in assembly.GetTypes())
{
markedMethods.AddRange(type.GetMethods().Where(m =>
{
DescriptionAttribute da = (DescriptionAttribute)m.GetCustomAttributes(typeof(DescriptionAttribute), true).FirstOrDefault();
return da != null && da.Description == "AntSK";
}));
}
} // 构建方法调用
foreach (var method in markedMethods)
{
var key = $"{method.DeclaringType.Assembly.GetName().Name}_{method.DeclaringType.Name}_{method.Name}";
string pattern = "[^a-zA-Z0-9_]";
// 使用 '-' 替换非ASCII的正则表达式的字符
key = Regex.Replace(key, pattern, "_");
_methodCache.TryAdd(key, method); var xmlCommentHelper = new XmlCommentHelper();
xmlCommentHelper.LoadAll(); var description = xmlCommentHelper.GetMethodComment(method);
var dict = xmlCommentHelper.GetParameterComments(method); var parameters = method.GetParameters().Select(x => (x.Name, x.ParameterType, dict[x.Name])).ToArray();
var returnType = xmlCommentHelper.GetMethodReturnComment(method); if (string.IsNullOrEmpty(description))
{
description = "导入插件";
}
_methodInfos.TryAdd(key, (description, (method.ReflectedType, returnType), parameters));
}
}

  

技术深度解读 

动态加载dll的涵义远不止于表面的灵活,它开辟了无需重启应用程序即可更新程序功能的可能。通过以上技巧,我们能够在代码运行时插入或移除功能模块,极大地提升了代码的模块化和可维护性。

结语

搭上.Net技术的快车,我们仿佛有了横穿时空的能力。AntSK 0.2.1版本正是这趟快车上一颗灿烂的星子,动态加载,插件化编程,让Function Call这一古老而又强大的术语,获得了新的生命力。而今日的揭秘之旅,不知是否已让您心潮澎湃,跃跃欲试?

别忘了,每一段代码都饱含着程序员的智慧与汗水,它们值得我们去细细玩味和传唱。如果想要了解更多.Net技术,别忘了关注我的公众号,后续还有更多精彩内容等待着你来探索。向着代码的化简难度,以及编程模块化的美好未来,我们携手同行,共同进步!

福利补充

为了让您更好地理解AntSK的插件化魔法,公众号下期将提供详细代码教程及其运用案例,敬请期待!别让知识止步于此,让我们在共享知识的海洋中,尽情航行吧!

AntSK 0.2.1 版本揭秘:动态加载dll,驱动Function Call新境界!的更多相关文章

  1. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

  2. unity3d动态加载dll的API以及限制

    Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Androi ...

  3. 用宏定义封装LoadLibrary,方便的动态加载dll

    同学们动态加载dll的时候是不是感觉挺麻烦的,每次都::LoadLibrary,::GetProcAddress,还要typedef一堆函数.最近闲来无聊,用宏封装了一下,可以少写不少代码,用来也挺方 ...

  4. c#实现动态加载Dll(转)

    c#实现动态加载Dll 分类: .net2009-12-28 13:54 3652人阅读 评论(1) 收藏 举报 dllc#assemblynullexceptionclass 原理如下: 1.利用反 ...

  5. C#,动态加载DLL,通过反射,调用参数,方法,窗体

    .net中常会用到动态加载DLL,而DLL中可能包含各种参数.方法.窗体,如何来调用动态加载这些参数.方法.窗体呢? 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System. ...

  6. c#实现动态加载Dll

    原文:c#实现动态加载Dll 原理如下: 1.利用反射进行动态加载和调用. Assembly assembly=Assembly.LoadFrom(DllPath); //利用dll的路径加载,同时将 ...

  7. 动态加载dll的实现+远线程注入

    1.在目标进程中申请内存 2.向目标进程内存中写入shellcode(没有特征,编码比较麻烦) 3.创建远线程执行shellcode 之前可以看到shellcode很难编写还要去依赖库,去字符串区等等 ...

  8. Delphi静态加载DLL和动态加载DLL示例

    下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...

  9. C# 利用反射动态加载dll

    笔者遇到的一个问题,dll文件在客户端可以加载成功,在web端引用程序报错.解决方法:利用反射动态加载dll 头部引用加: using System.Reflection; 主要代码: Assembl ...

  10. Unity3D的坑系列:动态加载dll

    我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码 ...

随机推荐

  1. 安装TFA用于快速收集RAC各类日志

    TFA一般主要用于Oracle RAC环境一键收集需要的日志进行分析问题,解决传统人工收集集群.数据库等各类日志效率低下的问题.具体关于TFA的介绍,网上资料已经非常多,在此不再赘述. TFA的安装也 ...

  2. python高级用法之命名元组namedtuple

    1.tuple类型数据的获取 大家都知道,元组里面的数据获取只能通过下标的方式去获取,比如 :a = ('username', 'age', 'phone'),要获取username的话 ,就需要用a ...

  3. MySQL优化技术系列-谓词下推(pushdown)

    谓词下推 将外层查询块的 WHERE 子句中的谓词移入所包含的较低层查询块(例如视图),从而能够提早进行数据过滤以及有可能更好地利用索引. 这在分区数据库环境中甚至更为重要,其原因在于,提早进行过滤有 ...

  4. burpsuit+adb+逍遥模拟器

    安卓7之后,单纯的将burpsuit的证书导出手动安装到模拟器中已经不行了,app可以只信任指定证书和系统内置的证书,后续用户安装的证书是不生效的,只能想办法装到系统内部 需要将证书通过openssl ...

  5. win32--GetFileAttributes

    DWORD d = GetFileAttributes(path.c_str()); 根据返回的十进制,对比文件属性,来检索指定文件或目录的文件系统属性. 也可以使用 if ((d & FIL ...

  6. python操作txt文件,去除文件中的隔行空行

    conn = re.sub(result, '\r\n', content) res = "".join( [s for s in conn.strip().splitlines( ...

  7. Advanced .Net Debugging 2:CLR基础

    一.简介 这是2024新年后我的第一篇文章,也是我的<Advanced .Net Debugging>这个系列的第二篇文章.这篇文章告诉我们为了进行有效的程序调试,我们需要掌握哪些知识.言 ...

  8. 第一百零四篇:DOM事件流

    好家伙,JS基础接着学,   1.事件流 页面哪个部分拥有特定的事件? 可以把页面想象成一个同心圆, 当你戳了其中的一点,其实你同时戳中了很多个圆   当你点击一个页面中的按钮,实际上你同时点击了这个 ...

  9. 【Azure App Service】同一个App Service下创建多个测试站点的方式

    问题描述 在一个App Service中,部署多个应用,每个应用相互独立,类似与IIS中在根目录下创建多个子应用的情况. 问题解答 可以的.通过App Service Configuration页面, ...

  10. 【Azure 存储服务】Azure Blob下面是否可以创建子文件夹

    问题描述 如何在Azure Storage Account(存储账户) 门户上为 Container 创建子文件夹? 问题解决 经验证,没有办法在门户上直接创建文件夹,不过可以使用Azure Stor ...