繁体   English   中英

Winform应用程序中的插件

[英]plugins in winform application

我有一个功能来加载存储库中的所有dll

namespace MFDBAnalyser

{

    public class PluginManager
    {

        /// <summary>
        /// This function gets the name of the plugins and return that in a datatable dt.
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        static void Main(string[] args)

        {

            List<string> assemblyNames = new List<string>();
            Assembly[] oAssemblies = new Assembly[args.Length];

            for(int assemblyCount = 0;assemblyCount < args.Length;assemblyCount++)
            {
                oAssemblies[assemblyCount] = Assembly.LoadFile(args[assemblyCount]);

                try
                {
                    foreach(Type oType in oAssemblies[assemblyCount].GetTypes())
                    {
                        // Check whether class is inheriting from IMFServicePlugin.
                        if(oType.GetInterface("IMFDBAnalyserPlugin") == typeof(IMFDBAnalyserPlugin))
                        {
                            assemblyNames.Add(args[assemblyCount].Substring(args[assemblyCount].LastIndexOf("\\") + 1));
                        }
                    }
                }
                catch(Exception ex)
                {
                    EventLog log = new EventLog("Application");
                    log.Source = "MFPluggerService";
                    log.WriteEntry(ex.Message);
                }
            }

            // Passing data one application domain to another.
            AppDomain.CurrentDomain.SetData("AssemblyNames", assemblyNames.ToArray());
        }

    }
}

还有另一个这样的接口类

public interface IMFDBAnalyserPlugin
{

    string RunAnalysis(string ConnectionString);

}

我需要返回在RunAnalysis方法中编写的字符串

public class PrimaryKeyChecker : IMFDBAnalyserPlugin
{

    public string RunAnalysis(string ConnectionString)

    {
        return "Hello Srivastav!";
    }
}

但是它具有Program.cs类作为应用程序的主要入口点。

    static class Program
    {

    /// <summary>
    /// The main entry point for the application.
    /// </summary>

    [STAThread]

    static void Main()

        {

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MFDBAnalyser());

        }
    }
}

因此,它显示了一个错误,即在一个应用程序中不能有两个主要对象。 我需要从pliginmanager.cs获取方法

我很困惑...你们能看看我的问题吗

您不应该让您的PluginManager类具有Main Method 那就是使编译器困惑的地方。

尝试重命名您的PluginManager.Main方法。

此外,您无法像执行new MFDBAnalyser一样实例化名称空间,而请尝试实例化您的类。

希望这可以帮助!

您已将类库与应用程序代码混合在一起。 我不认为您希望PluginManager成为主要运行的应用程序。

其次,尝试使用IsAssignableFrom而不是GetInterface,因为当GetInterface找不到给定类型的接口时,它将返回null

foreach(Type oType in oAssemblies[assemblyCount].GetTypes())
{
    if(typeof(IMFDBAnalyserPlugin).IsAssignableFrom(oType)) {
        assemblyNames.Add(args[assemblyCount].Substring(args[assemblyCount].LastIndexOf("\\") + 1));
    }
}

而且很可能就像您的xml注释中所说的那样,如果您打算返回插件列表,则需要在函数末尾返回assemblyNames列表。

另外,您最好使用Managed Extensibility Framework,而不是构建自己的插件框架。

简而言之,删除不使用的Main()方法,如果要使用它,请从主Application Main()方法中调用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM