c# - 使用Assembly.Load 正确加载依赖项

主程序代码

删除dll依旧可以执行

https://files.cnblogs.com/files/NanShengBlogs/sample.zip

 

 

 

复制代码
 1  static void Main(string[] args)
 2         {
 3             //PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");
 4             string dir= Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
 5 
 6             AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
 7 
 8             Assembly ass = Assembly.Load(File.ReadAllBytes(Path.Combine(dir,"ClassLibrary2.dll")));
 9 
10             List<Assembly> assDepe = new List<Assembly>();
11 
12             Type t = ass.GetType("ClassLibrary2.Class");
13 
14             var obj=Activator.CreateInstance(t);
15             
16             var refereces = ass.GetReferencedAssemblies();
17 
18             foreach (AssemblyName item in refereces)
19             {
20                 if (AppDomain.CurrentDomain.GetAssemblies().Count(c => c.FullName== item.FullName)==0)
21                 {
22                     assDepe.Add(Assembly.Load(File.ReadAllBytes(Path.Combine(dir,item.Name + ".dll"))));
23                 }
24             }
25             var ms = t.GetMethod("MyFunc").Invoke(obj, new object[] { 20, 30 });
26             Console.WriteLine(ms);
27             Console.ReadLine();
28         }
29 
30         private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
31         {
32            return AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.GetName().FullName.Split(',')[0] == args.Name.Split(',')[0]);
33         }
34     }
复制代码
"ClassLibrary2"项目

 

 

 

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 using ClassLibrary1;
 8 
 9 namespace ClassLibrary2
10 {
11     public class Class
12     {
13         public double MyFunc(double a, double b)
14         {
15             return ClassLibrary1.mycls.MyAdd(a, b);
16         }
17     }
18 }
复制代码

 

"ClassLibrary1"项目

 

 

 

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ClassLibrary1
 8 {
 9     public static class mycls
10     {
11         public static double MyAdd(double a,double b)
12         {
13             return a + 2*b;
14 
15         }
16         public static double MyMinus(double a, double b)
17         {
18             return a -b+5;
19 
20         }
21     }
22 }
复制代码
posted @   南胜NanSheng  阅读(2301)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示