我有一个加载存储库中所有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中获取方法
我很困惑......请你们看看我的问题
答案 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()方法中调用它。