[c#]Praca s pluginami

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod sejnt 14. 3. 2013 01:52

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:)
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar

Odeslat příspěvekod mosquito 14. 3. 2013 07:58

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

Odeslat příspěvekod sejnt 14. 3. 2013 13:11

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
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar

Odeslat příspěvekod mosquito 14. 3. 2013 13:59

- 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
mosquito
Junior

Odeslat příspěvekod Nargon 14. 3. 2013 14:19

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.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod sejnt 15. 3. 2013 17:53

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
Lekvár je produkt šialenej myšlienky ako neurobiť zo všetkých sliviek slivovicu.[CZ] Povidla jsou produkt šílený myšlenky jak neudelat ze všech švestek slivovici.
sejnt
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků