AntSK 0.2.1 版本揭秘:动态加载dll,驱动Function Call新境界!
在.NET的无限宇宙中,动态加载dll似乎一直是操控代码生生不息的魔杖。今天,我将与您探讨如何通过AntSK 0.2.1 版本灵活运用dll,将Function Call的强大功能插拔自如地融入项目之中,我们走入插件化开发的全新篇章。
新版本简介
AntSK,这个曾被我们广泛探讨过的Semantic Kernel项目,这次再度带来惊喜。在早先版本我们已经见识了其实现Function Call的威力。今日,我们有幸见证其升级再进化,0.2.1 版本究竟有何过人之处?答案就是:“动态加载dll”,这一核心玄机助您将代码实现插件化,不再拘泥于单一的AntSK平台编写,带来更加灵活的扩展性。
核心编程揭秘
要想细致品味动态加载dll的精妙,首先要解开的锁就是“约定”。AntSK要求插件明晰其身份,一段标明“AntSK”特性的代码如同通行证,使得函数得以插入AntSK的世界。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class TestFunctionImport { /// <summary> /// 获取名称 /// </summary> /// <returns>返回名称</returns> [Description( "AntSK" )] public string GetName() { return $ "" " 我的名字是AntSK, 我的作者是许泽宇 我是一个AI 知识库/智能体项目 "" "; } } |
接下来,动态加载这块宝藏怎能轻易让人得逞?我们需要通过AssemblyLoadContext这位严厉的守门人,创建一个隔离的上下文,一步步引领我们:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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插件”芳容?以下搜寻被特性标记的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 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的插件化魔法,公众号下期将提供详细代码教程及其运用案例,敬请期待!别让知识止步于此,让我们在共享知识的海洋中,尽情航行吧!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验