[英]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.