2010-12-06 11 views
0

ich eine Funktion fürPlugins in winform Anwendung

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()); 
     } 

    } 
} 

im Repository alle DLL-Laden und eine andere Schnittstelle Klasse wie diese

public interface IMFDBAnalyserPlugin 
{ 

    string RunAnalysis(string ConnectionString); 

} 

Was ich brauche, ist die Zeichenfolge zurück, die ich schrieb in der RunAnalysis Methode

Aber es hat eine Program.cs Klasse als Haupteingangspunkt für t er Anwendung.

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()); 

     } 
    } 
} 

So zeigt es den Fehler, dass keine zwei Haupt dort in einer Anwendung sein können. Ich brauche die Methoden Feuer von den pliginmanager.cs

Ich bin sehr verwirrt ... Can u Jungs haben bitte an meinem Problem

+2

Benutzt du die 'PluginManager' Klasse direkt? Wenn ja, hör auf damit. Die nächste seltsame Sache ist, dass "MFDBAnalyser" ein Namespace ist und daher nicht mit "neu" instanziiert werden kann. Versteh mich nicht falsch, aber deine Codebeispiele enthalten etwas, das entweder faul oder sehr falsch ist. – Bobby

+0

Ich stimme Bobby zu, Ihre Codebeispiele sind Bizarres. –

Antwort

0

Sie sollten Ihre Plugin Klasse haben keinen Blick bekommen lassen einen Main Method . Das verwirrt den Compiler.

Versuchen Sie, Ihre PluginManager.Main Methode umzubenennen.

Darüber hinaus können Sie nicht einen Namespace instanziieren wie wenn Sie new MFDBAnalyser tun, versuchen Sie stattdessen, Ihre Klasse zu instanziieren.

Hoffe, das hilft!

0

Sie haben die Klassenbibliothek mit dem Anwendungscode verwechselt. Ich glaube nicht, dass Sie den PluginManager als die am meisten laufende Anwendung haben wollten.

Zweitens versucht IsAssignableFrom statt GetInterface als GetInterface wird null zurück, wenn es nicht die Schnittstelle in der gegebenen Art finden

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

Und höchstwahrscheinlich als XML-Kommentar sagt, wenn Ihre Absicht ist es, die Liste zurückzukehren von Plugins müssten Sie die Liste assemblyNames am Ende der Funktion zurückgeben.

Alternativ wäre es besser, wenn Sie Managed Extensibility Framework verwenden, anstatt ein eigenes Plugin-Framework zu erstellen.

0

Kurz gesagt, löschen Main() -Methode, die Sie nicht verwenden, und wenn Sie es verwenden, rufen Sie es von der Hauptanwendung Main() -Methode.

Verwandte Themen