Stránka 1 z 1

[c#]Praca s pluginami

Odeslat příspěvekNapsal: 14. 3. 2013 01:52
od sejnt
Zdravim..takze mam spravit pluginovu aplikaciu..nacitanie pluginov vsetko mi ide.A ja vo winforms spracujem nejake *.csv ziskam z neho metada tie si ulozim do List<T>.No a ja sa neviem nejak dopracovat k tomu ako mam tie data z toho listu predat tomu pluginu ktory si ja zvolim na dalsie spracovanie .robil som podla tohto http://www.codeproject.com/Articles/6334/Plug-ins-in-C..alebo aj http://programujte.com/clanek/2006041802-c-aplikace-s-podporou-pluginu/..Stale z toho nedokazem pochopit ako nejaky zvoleny item,alebo ich moze byt viacej z toho mojho listu predam pluginu a on s nim dalej bude pracovat..Dakujem za objasnenie:)

Re: [c#]Praca s pluginami

Odeslat příspěvekNapsal: 14. 3. 2013 07:58
od mosquito
do interface spol. pro vsechny pluginy si pridej metodu treba ProcessCSV() s parametrem treba nazev souboru nebo prasacky rovnou data pokud uz ho mas nacteny, samozrjeme do vsch pluginu tuto metodu musis pridat a ta uz bude neco delat a zavolas to pres interface napr.

foreach(IPlugin p in PluginList)
{
p.ProcessCSV(...);
}

Re: [c#]Praca s pluginami

Odeslat příspěvekNapsal: 14. 3. 2013 13:11
od sejnt
Do toho spolocneho interfaceu som dal tu metodu ktora prijma parameter typu object. Pretoze ja jej v tom hostovskom programe predavam parameter typu List<Attributes> pricom Attributes je mnou definovana trieda..takze ja potom neviem ako v tom plugine s tym mojim listom pracovat..Dalo by sa to spravit tak ze kazdy plugin by poznal ten moj datovy typ Attributes ??lebo nic ine ma nenapada. Dakujem

Re: [c#]Praca s pluginami

Odeslat příspěvekNapsal: 14. 3. 2013 13:59
od mosquito
- je obecne prasecina aby metoda mela argument typu object .. to se vzdy vymsti

- pokud to uz budes tlacit na object, tak se muzes v pluginu zeptat
if (paramObject is List<Attribute>)
{
List<Attribute> colAttrib = (List<Attribute>)paramObject;
....
}

- lepe nez List<Attribute> do object je pouzit Dictionary<Enum, Attribute> kde Enum je vycet moznych parametru a atribut je skutecna hodnota (pekne se vycucavaji parametry, ale musi byt unikatni - pokud muze byt vice stejnych atributu tak to zapouzdrit do kolekce) a samo aby parametr byl typu Dictionary<Enum, Attribute>

- nebo pouzit misto Dictinary zastupnou tridu ale object fakt nebrat

Re: [c#]Praca s pluginami

Odeslat příspěvekNapsal: 14. 3. 2013 14:19
od Nargon
Bud ty pluginy musí mít referenci na tvůj "základní" program a ten datový typ musí být public. A nebo musíš udělat společnou knihovnu, kde budou ty tvoje datové typy a musíš jí dat do reference jak základního programu tak i toho pluginu.

Re: [c#]Praca s pluginami

Odeslat příspěvekNapsal: 15. 3. 2013 17:53
od sejnt
No a este jedna otazka,mam naimplementovany plugin ktory pocita priemer

Kód: Vybrat vše
public AveragePlugin()
        {
        }     
        string myName = "Get Average";

        public List<Attribut> pluginList = new List<Attribut>();

        public void getData(List<Attribut> a)
        {
            pluginList = a;
        }

        public double getAverage()
        {
            double average = 0;
            int count = 0;
            foreach (var item in pluginList)
            {
                average = item.Sum / item.Count;
                count++;
                 }
                 return average / count;
            }

               IPluginHost myHost = null;
      System.Windows.Forms.UserControl myMainInterface = new ctlAverage();
      /// <summary>
      /// Description of the Plugin's purpose
      /// </summary>
        ///
     
      
      /// <summary>
      /// Host of the plugin.
      /// </summary>
      public IPluginHost Host
      {
         
         get
         {
            return myHost;
         }
         set   
         {
            myHost = value;
                 ctlAverage avgControl = (ctlAverage)myMainInterface;
            avgControl.PluginHost = this.Host;
                                avgControl.Plugin = this;
         }
      }
       
      public string Name
      {
         get {return myName;}
      }

                public System.Windows.Forms.UserControl MainInterface
      {
         get {return myMainInterface;}
      }


      public void Initialize()
      {
      }
      
      public void Dispose()
      {
      }


iba metoda getAverage() nie je nadefinovana v rozhrani..Moj problem spociva v tom, ze ja chcem zobrazit v host programe User Control kde sa mi zobrazia vysledky..ale nato aby som tu metodu predal tomu User Controlu potrebujem vytvorit objekt AveragePlugin a potom tam tu metodu zavolam..lenze ako nahle spravim AveragePlugin() ap= new AveragePlugin()..tak mi vyhodi chybu System.StackOverflowException pri nacitani pluginov

Kód: Vybrat vše
newPlugin.Instance =(IPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()))
.

Vyriesil som to tak ze som cely ten plugin implementoval do toho User Controlu..len mi to nepride moc spravne..nie je nejake elegantnejsie riesenie ? Dakujem