为什么AssemblyResolver即使在加载dll(manualy)时也会触发?

时间:2015-08-24 09:06:18

标签: c# .net dll .net-assembly

我有2个项目的C#解决方案:

  1. DLLTest(控制台应用)
  2. BLib(图书馆)
  3. 在DLLTest中,我设置了对BLib的引用,并将Copy Local属性设置为false 编译解决方案。
    将BLib.dll复制到' C:\ BLib.dll'并运行申请 在我的代码的第一步中,我从路径' C:\ BLib.dll'加载程序集。然后从那里调用方法。在从BLib程序集调用方法时触发AssemblyResolver并尝试加载我手动加载的程序集。

    我可以做一些应用程序知道库已经加载而不再尝试加载吗? 这是来自BLib项目的 BClass.cs 文件:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace BLib
    {
        public class BClass
        {
            public static void PrintName()
            {
                Console.WriteLine("BLib");
            }
        }
    }
    

    这是来自DLLTest项目的 Program.cs 文件:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    
    namespace DLLTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
                Assembly.LoadFile(@"C:\BLib.dll");
                Console.WriteLine("Loaded assembles:");
                AppDomain.CurrentDomain.GetAssemblies().ToList()
                    .ForEach(p => Console.WriteLine(p));
                Console.WriteLine("End list of assembles");
                try
                {
                    PrintMessage();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                Console.ReadKey();
            }
    
            private static void PrintMessage()
            {
                BLib.BClass.PrintName();
            }
    
            private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                Console.WriteLine(args.Name);
                return null;
            }
        }
    }
    

1 个答案:

答案 0 :(得分:0)

我发现了类似的问题Why is AssemblyResolve called when Assembly is in CurrentDomain?从那里回答Choosing a Binding Context,其中详细描述了所有内容( )。< / p>

我认为如此,这是安全原因。