2010-12-06 52 views
0

我有這樣插件在WinForm應用程序

public interface IMFDBAnalyserPlugin 
{ 

    string RunAnalysis(string ConnectionString); 

} 

加載所有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()); 
     } 

    } 
} 

一個功能和其他接口類我需要的是返回字符串,我在RunAnalysis方法中寫道

public class PrimaryKeyChecker : IMFDBAnalyserPlugin 
{ 

    public string RunAnalysis(string ConnectionString) 

    { 
     return "Hello Srivastav!"; 
    } 
} 

但它有一個Program.cs類作爲t的主入口點他的申請。

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

我很困惑獲得方法火... u人都可以請看看我的問題

+2

你是直接使用`PluginManager`類嗎?如果是,請停止這樣做。接下來奇怪的是,`MFDBAnalyser`是一個名字空間,因此不能用`new`實例化。不要誤解我的意思,但是你的代碼示例中有些東西可能有些蹊蹺或者說錯了。 – Bobby 2010-12-06 10:31:12

回答

0

你不應該讓你的插件管理Main Method 。這是混淆編譯器。

嘗試重命名您的PluginManager.Main方法。

此外,你不能實例化一個名字空間,就像你做new MFDBAnalyser時一樣,試着實例化你的類。

希望這會有所幫助!

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而不是構建自己的插件框架。

0

簡而言之,刪除您不使用的Main()方法,並且如果您確實使用它,請從主Application Main()方法調用它。