• .Net平台下实例类型无法转换成接口类型?


    首先这种情况出现在应用程序启动前的方法里面。

    本想通过发射来实现一些功能。谁知道被这个坑了。

    碰到这种问题。已经相当无语了。同时也不知道该如何解决。望有能之士帮忙解答

    using System;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    using System.Web.Compilation;
    using System.Web.Hosting;
    using Infrastructure;
    
    [assembly: PreApplicationStartMethod(typeof(PreApplicationInit), "InitializePlugins")]
    namespace Infrastructure
    {
        public class PreApplicationInit
        {
            static PreApplicationInit()
            {
                var pluginsPath = HostingEnvironment.MapPath("~/plugins");
                
                var pluginsTempPath = HostingEnvironment.MapPath("~/plugins/temp");
    
                if (pluginsPath == null || pluginsTempPath == null)
    	            throw new DirectoryNotFoundException("plugins");
    
                PluginFolder = new DirectoryInfo(pluginsPath);
                TempPluginFolder = new DirectoryInfo(pluginsTempPath);
            }
    
            /// <summary>
            /// The source plugin folder from which to copy from
            /// </summary>
            /// <remarks>
            /// This folder can contain sub folders to organize plugin types
            /// </remarks>
            private static readonly DirectoryInfo PluginFolder;
    
            /// <summary>
            /// The folder to  copy the plugin DLLs to use for running the app
            /// </summary>
            private static readonly DirectoryInfo TempPluginFolder;
    
            /// <summary>
            /// Initialize method that registers all plugins
            /// </summary>
            public static void InitializePlugins()
            {
                var assemblies = PluginFolder.GetFiles("*.dll", SearchOption.AllDirectories)
                        .Select(x => Assembly.LoadFrom(x.FullName));
    
                foreach (var assembly in assemblies)
                {
                    var type = assembly.GetTypes().FirstOrDefault(t => t.GetInterface(typeof(IModule).Name) != null);
                    if (type == null) continue;
                    //Add the plugin as a reference to the application
                    if (AppDomain.CurrentDomain.GetAssemblies().All(a => a.FullName != assembly.FullName))
                    {
                        BuildManager.AddReferencedAssembly(assembly);
                    }
    
                    //Add the modules to the PluginManager to manage them later
                    var module = (IModule)Activator.CreateInstance(type);
                    PluginManager.Current.Modules.Add(module, assembly);
                }
            }
        }
    }
    

      上面是代码。

    如果通过Type.IsAssignableFrom方法来查找接口的实现,根本查不到。

    这是目录结构

    这是Module的实现

    using System;
    using Infrastructure;
    
    namespace NewsPlugin
    {
        public class Module:IModule
        {
            public string Name {
                get
                {
                    return "NewsPlugin";
                }
                set
                {
                    if (value == null) throw new ArgumentNullException("value");
                    this.Name = value;
                }
            }
        }
    }
    

  • 相关阅读:
    任何有模的计量器,均可化减法为加法运算
    定时器:4叉堆与2叉堆的效率比较_znHD的博客CSDN博客 https://blog.csdn.net/znzxc/article/details/85916740
    网络智能运维的升级 Telemetry vs SNMP
    供应链仿真体系建设实践
    【leetcode】链表的中间结点
    【leetcode】合并K个升序链表
    【leetcode】141. 环形链表 142. 环形链表 II
    [Leetcode]21. 合并两个有序链表
    【leetcode】19. 删除链表的倒数第 N 个结点
    [leetcode] 2055蜡烛之间的盘子 | 前缀和
  • 原文地址:https://www.cnblogs.com/showstyle/p/3706188.html
Copyright © 2020-2023  润新知