none
如何实现加载子目录下的程序集 RRS feed

  • 问题

  • 首先, 主程序中静态引用了一些dll中的接口 Ixxxxx. 这些接口的实现代码在另外的dll里。

    主程序启动后 ,通过查找指定子目录下的指定文件来创建接口的实例 。 之后就可以以接口的形式调用。

    问题出在,接口的实现dll可以被 Assembly.LoadFrom 或 LoadFile加载 。但当使用 assembly.GetTypes() 报错。 

    无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。

    接口的实现dll同时引用了额外的dll。

    使用AppDomain.CurrentDomain.AssemblyResolve, 但是,此方法不被调用.

        public partial class Form1 : Form
        {
            private IVideoPlayer _videoPlayer;
    
            public Form1()
            {
                AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    
                InitializeComponent();
                
            }
    
            private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                Debug.WriteLine(args.Name);
    
                return Assembly.LoadFrom(args.Name);
            }
    
            public static bool MyInterfaceFilter(Type typeObj, Object criteriaObj)
            {
                if (typeObj.ToString() == criteriaObj.ToString())
                    return true;
                else
                    return false;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                if (_videoPlayer == null)
                {
                    var file1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "videoPlayer", "HikVideoPlayerXp.dll");
                    Debug.WriteLine(file1);
                    var assembly = Assembly.LoadFile(file1);
    
                    var types = assembly.GetTypes();
                    foreach (var type in types)
                    {
                        var list = type.FindInterfaces(MyInterfaceFilter, typeof(IVideoPlayer));
                        if (list.Length == 1)
                        {
                            _videoPlayer = Activator.CreateInstance(type) as IVideoPlayer;
                            break;
                        }
                    }
                }
    
                if (_videoPlayer != null)
                {
                    if (!_videoPlayer.Login("17.1.10.1", 8000, "j123"))
                    {
                        Debug.WriteLine(_videoPlayer.Error);
                    }
                    else
                    {
                        if (!_videoPlayer.RealtimePlay(panel1.Handle))
                        {
                            Debug.WriteLine(_videoPlayer.Error);
                        }
                    }
                }
    
            }
        }


    • 已编辑 jinli.zh 2020年9月22日 15:43 modify
    2020年9月22日 15:41

全部回复