Toon posts:

[C#] Console Applicatie met Plugins

Pagina: 1
Acties:

Onderwerpen


  • PrePay
  • Registratie: januari 2009
  • Laatst online: 22-01 02:10
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?

  • Sebazzz
  • Registratie: september 2006
  • Laatst online: 18:53
Kijk eens naar MAF - Managed Addins Framework.

[Website en online portfolio] [Return: realtime retrospective tool] [PokerTime planning poker]


  • Vinnienerd
  • Registratie: juli 2000
  • Laatst online: 00:40
Als je gaat Googlen op Delegates vind je wel wat je moet hebben :)

  • PrePay
  • Registratie: januari 2009
  • Laatst online: 22-01 02:10
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
    }

  • RxB
  • Registratie: september 2001
  • Laatst online: 07-02-2017
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 RxB op 10-10-2010 21:38]


  • yade
  • Registratie: mei 2002
  • Laatst online: 16-09 21:02

  • RxB
  • Registratie: september 2001
  • Laatst online: 07-02-2017
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 RxB op 10-10-2010 23:57. Reden: overbodige meuk er uit gehaald]


  • PrePay
  • Registratie: januari 2009
  • Laatst online: 22-01 02:10
@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


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee