【问题标题】:VB.NET dynamic plugin componentsVB.NET 动态插件组件
【发布时间】:2012-08-21 12:55:08
【问题描述】:

我不是 VB 开发人员,但我正在领导一个部分使用 VB 的大型项目。要求之一是实现插件架构以支持动态可扩展的应用程序核心。

我们的 VB 开发人员似乎认为可以将 BLL 存储在 DLL 中 - 将接口全部保留在原始核心应用程序中 - 在安装扩展之前使其无用。

显然这不太理想。我想知道是否可以将整个子应用程序/组件保留在一个不同的 DLL 中,将其加载到核心平台中???

有什么想法吗?

【问题讨论】:

    标签: .net vb.net plugins


    【解决方案1】:

    这根本不是问题,看看我的示例代码。 这是存在于单独 dll 中的抽象类:

    public abstract class ServerTask
    {
        public int TaskId { get; set;}
    
        /// <summary>
        /// Gets description for ServerTask
        /// </summary>
        public abstract string Description { get; }
    
    
    }
    

    这是插件实现的代码:

    public class SampleTask : GP.Solutions.WF.Entities.Tasks.ServerTask
    {
    
        public override string Description
        {
            get 
            {
                return "Sample plugin";
            }
        }
    
    }
    

    最后是加载插件的核心应用程序代码:

        /// <summary>
        /// Loads Plugin from file
        /// </summary>
        /// <param name="fileName">Full path to file</param>
        /// <param name="lockFile">Lock loaded file or not</param>
        /// <returns></returns>
        static Entities.Tasks.ServerTask LoadServerTask(string fileName, bool lockFile, int taskId)
        {
            Assembly assembly = null;
            Entities.Tasks.ServerTask serverTask = null;
            if (lockFile)
            {
                assembly = System.Reflection.Assembly.LoadFile(fileName);
            }
            else
            {
                byte[] data = Services.Common.ReadBinaryFile(fileName);
                assembly = System.Reflection.Assembly.Load(data);
            }
            Type[] types = assembly.GetTypes();
            foreach (Type t in types)
            {
                if (t.IsSubclassOf(typeof(Entities.Tasks.ServerTask)))
                {
                    serverTask = (Entities.Tasks.ServerTask)Activator.CreateInstance(t);
                    serverTask.TaskId = taskId;
                    break;
                }
            }
            if (serverTask == null)
            {
                throw new Exception("Unable to initialize to ServerTask type from library '" + fileName + "'!");
            }
            return serverTask;
        }
    

    如果你不熟悉 c#,只需使用 c# 到 vb.net 在线转换器。

    编码愉快,问候! 格雷戈尔普里玛

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 2015-03-21
      • 2017-03-27
      • 2016-12-18
      • 2022-01-16
      • 2019-12-12
      • 2019-12-08
      • 1970-01-01
      相关资源
      最近更新 更多