[C#] Console Applicatie met Plugins

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • PrePay
  • Registratie: Januari 2009
  • Laatst online: 07-09 00:34
Ik ben al 2 dagen aan het proberen om een redelijk Plugin systeem te ontwikkelen voor mijn Console Applicatie. Deze plugins zijn DLL bestanden. Dit is een voorbeeld van 1 van mijn tests:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public partial class CommandManager
    {
        private void Test(string[] args)
        {
            Console.WriteLine("Test command executed.");
        }

        private void Test2(string[] args)
        {
            Console.WriteLine("Test2 command executed.");
        }


        public void RegisterCommands()
        {
            mCommandHandlers.Add("test", new Line.Core.CommandManager.CommandHandler(Test));
            mCommandHandlers.Add("test2", new Line.Core.CommandManager.CommandHandler(Test2));
        }
    }


Ik heb dit systeem dus in mijn 'hoofdapplicatie' ook. Daar werkt het prima, dus ik dacht. Als ik nou gewoon een partial class er van maak, dan gewoon in een DLL bestand doe. Maar dan weet ik niet hoe ik die RegisterCommands() moet uitvoeren.

Op google heb ik ook al veel onderzoek gedaan naar Interface's etc, maar elke keer als ik zoiets probeerde was het gemaakt voor Form applicaties. En ik snap niet hoe ik dan bijv die commands kon toevoegen aan mijn commands lijst.

Iemand tips voor het schrijven van dit soort plugins?

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Kijk eens naar MAF - Managed Addins Framework.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Vinnienerd
  • Registratie: Juli 2000
  • Laatst online: 22:42
Als je gaat Googlen op Delegates vind je wel wat je moet hebben :)

Acties:
  • 0 Henk 'm!

  • PrePay
  • Registratie: Januari 2009
  • Laatst online: 07-09 00:34
Ik ga eens opzoek naar dat MAF systeem.

@Vinnienerd:
Hoe wil je Delegates koppelen aan plugins?

Ik gebruik delegates om mijn Commands te herkennen zoals hieronder:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    public partial class CommandManager
    {
        #region Fields
        public delegate void CommandHandler(string[] args);
        public Dictionary<string, CommandHandler> mCommandHandlers;
        #endregion

        #region Constructor
        public CommandManager()
        {
            mCommandHandlers = new Dictionary<string, CommandHandler>();
        }
        #endregion

        #region Methods
        public void HandleCommand(string lines)
        {
            string command = lines.Split(' ').First();
            if (!mCommandHandlers.ContainsKey(command))
                LineEnvironment.GetLog().WriteError("Unknown Command, Not in Application nor Plugins");
            if (mCommandHandlers[command] == null)
                LineEnvironment.GetLog().WriteError("Command not registred.");

            string[] args = lines.Split(' ');
            mCommandHandlers[command].Invoke(args);
        }
        #endregion
    }

Acties:
  • 0 Henk 'm!

Verwijderd

De normale manier voor plugins is een interface maken
een class maken die de interface implementeert.

de dll's laden at runtime.
en de functies in je interface aanroepen

op codeproject staan wel enkele voorbeelden
http://www.codeproject.com/KB/cs/pluginsincsharp.aspx

[ Voor 22% gewijzigd door Verwijderd op 10-10-2010 21:38 ]


Acties:
  • 0 Henk 'm!

  • yade
  • Registratie: Mei 2002
  • Laatst online: 16-07 13:47

Acties:
  • 0 Henk 'm!

Verwijderd

Heb snel ff wat in elkaar geflanst

De interface
C#:
1
2
3
4
5
6
7
namespace PluginLib
{
    public interface IPlugin
    {
        string ShowBericht();
    }
}


de Plugin
C#:
1
2
3
4
5
6
7
8
9
10
using PluginLib;
namespace Plugin1
{
    public class Plugin1 : IPlugin
    {
        public string ShowBericht()
        {
            return DateTime.Now.ToString();
        }
    }


en dan in je console app

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        private void plugmessage()
        {
             PluginLib.IPlugin plug = LoadPlugin(@"C:\Users\Roy\Documents\Visual Studio 2008\Projects\PlugIT\Plugin1\bin\Debug\plugin1.dll");
            if (plug != null)
                MessageBox.Show(plug.ShowBericht());
        }
        private IPlugin LoadPlugin(string bestandsnaam)
        {
            Assembly pluginAsm = Assembly.LoadFrom(bestandsnaam);

            foreach (Type pluginType in pluginAsm.GetTypes())
            {
                if (pluginType.GetInterface("PluginLib.IPlugin", true) != null)
                {
                    return (IPlugin)Activator.CreateInstance(pluginAsm.GetType(pluginType.ToString())); ;

                }
            }
            return null; 
        }


wel heel simpel maar dit doet precies wat je wil :z

[ Voor 101% gewijzigd door Verwijderd op 10-10-2010 23:57 . Reden: overbodige meuk er uit gehaald ]


Acties:
  • 0 Henk 'm!

  • PrePay
  • Registratie: Januari 2009
  • Laatst online: 07-09 00:34
@linux_freak
Bedankt voor je code, Nu is het een beetje duidelijk hoe plugins eingelijk werken. Ik denk dat ik op deze manier wel iets in elkaar kan krijgen.

Bedankt.
Pagina: 1