winform应用程序中的插件

时间:2010-12-06 10:21:47

标签: c#

我有一个加载存储库中所有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());

        }
    }
}

所以它显示的错误是在一个应用程序中没有两个main可以存在。 我需要从pliginmanager.cs中获取方法

我很困惑......请你们看看我的问题

3 个答案:

答案 0 :(得分:0)

您不应该让 PluginManager 类拥有Main Method。这就是困扰编译器的原因。

尝试重命名 PluginManager.Main 方法。

此外,您不能像执行new MFDBAnalyser那样实例化名称空间,而是尝试实例化您的类。

希望这有帮助!

答案 1 :(得分:0)

您已将类库与应用程序代码混合在一起。我认为你并不认为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而不是构建自己的插件框架。

答案 2 :(得分:0)

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