Cleaner .NET – jak pisać własne pluginy?

Ten wpis jest skierowany do osób, które chciałyby napisać swój własny plugin do opisywanego przeze mnie wczoraj Cleanera 😉 Zaczynajmy więc!

Tworzymy nowy projekt

Pierwszą rzeczą, jaką należy zrobić, jest oczywiście stworzenie nowego pustego projektu. Musi być to projekt typu Class Library, a więc biblioteka klas. Po jego kompilacji otrzymamy plik *.dll, który po dodaniu do folderu plugins zostanie załadowany przez Cleanera. Oczywiście pod warunkiem, że zachowamy pewien wzorzec podczas pisania naszego pluginu 😉plugin1

Po utworzeniu nowego projektu domyślnie będzie istniała tylko jedna klasa o nazwie Class1, zmieńmy jej nazwę na Main – będzie wiadomo, że to tutaj program rozpoczyna wykonywanie pluginu. Niezbędne będzie też dodanie referencji do PresentationFramework, oraz WindowsBase.

Dodajemy niezbędne właściwości i metody

Właściwości

Program do poprawnego interpretowania pluginu potrzebuje obecności dwóch właściwości oraz dwóch metod. Powinny być one umieszczone wewnątrz klasy Main. Właściwości te, to:

Pierwsza reprezentuje wersję programu, dla którego przeznaczony jest plugin. Obecna wersja programu to 1.x.x, więc wpisujemy tutaj liczbę jeden. W przypadku aktualizacji programu do nowszej wersji, ten poinformuje użytkownika na podstawie wartości CleanerNetVersion, że używa pluginu nieprzeznaczonego do pracy z tą wersją programu.

Druga właściwość to po prostu wyświetlana wewnątrz programu nazwa pluginu.

Metody

Główna klasa pluginu musi zawierać też dwie niezbędne metody. Pierwszą z nich jest:

Metoda ta wywoływana jest podczas uruchamiania programu, zwraca ona listę obiektów, które mają zostać dodane do sekcji „inne” w programie. Generalnie rzecz biorąc, powinny to być po prostu TextBlock’i oraz CheckBox’y.

Drugą metodą jest:

Ta metoda z kolei jest wywoływana tyle razy, ile zostało zaznaczonych CheckBoxów należących do pluginu w oknie programu. Przykład? Załóżmy, że dodaliśmy w metodzie GUIElements trzy CheckBoxy, a użytkownik zaznaczył dwa takie elementy. W związku z tym metoda PluginMethod zostanie wywołana dwa razy. Za każdym wywołaniem będzie ona przyjmować obiekt CheckBox’a, który został zaznaczony. To pozwala nam na obsłużenie zdarzeń w zależności od tego, jaki CheckBox został przez użytkownika zaznaczony. Kolejne argumenty to: bool, który mówi o tym, czy wciśnięto przycisk analizuj, czy też czyść. Dispatcher, który jest uchwytem do głównego wątku aplikacji, oraz CultureInfo, które informuje nas o tym jaki jest obecny język aplikacji. Metoda zwraca stringa, który jest wyświetlany w TextBoxie, w oknie głównym programu. Powinna być to informacja o tym, ile elementów zostało usuniętych/ile zostanie usuniętych.

Cóż z teorii to byłoby na tyle, przedstawię więc teraz jakiś prosty przykładowy plugin 😉

Efekt działania po dodaniu dll’ki do folderu plugins oraz wciśnięciu przycisku analizuj:

a

Jak widać wszystko działa jak należy 😉 Działanie metody GUIElements, chyba nie wymaga większego wyjaśnienia. Przejdę, więc od razu do metody PluginMethod. 

Ta sekcja metody jest niezbędna do działania pluginu, no może poza pierwszą linijką, który tylko ustawia język dla wątku. Jednak to temat na inny wpis 😉

Obecne tutaj pole int jest indeksem, który wskazuje jaka część kodu ma się wykonać w tym konkretnym wywołaniu metody. Wartość indeksu jest ustawiana w sposób jaki widać wyżej. Tj. jeżeli obiekt przyjęty przez funkcję jest naszym checkBoxem oznacza to, że ma wykonać się jakiś kod. Sprawdzanie tego stanu rzeczy musi odbywać się na wątku okna, dlatego też całość zamknięta jest w GuiThr.Invoke() i w zależności od tego, jaki CheckBox został przez funkcję przyjęty zostaje ustawiony jego unikalny indeks. Z kolei na jego podstawie już w osobnym wątku pluginu możemy wykonywać swoje akcje – bez zamrażania wątku okna.

To co tutaj opisałem to takie podstawy podstaw. Nie wiem na ile ktoś może być tym zainteresowany, więc wydaje mi się, że póki co tyle informacji wystarczy. Jeżeli jesteście zainteresowani szczegółami to dajcie znać 😉 Przypominam też, że jest dostępny kod nieco bardziej skomplikowanego pluginu: klik. Czytając jego kod można dowiedzieć się znacznie więcej. M.in jak stworzyć plugin wielojęzyczny.

Może rozwiązanie, jakie wymyśliłem nie jest jakieś super eleganckie, jednak działa 😉 Jeżeli macie jakieś uwagi/pytania lub zauważyliście jakieś błędy – zapraszam do komentowania.

AKTUALIZACJA (25.03.2017)

Od teraz pluginy muszą implementować interfejs.

383 total views, 1 views today

4 przemyślenia nt. „Cleaner .NET – jak pisać własne pluginy?

    • Nigdy o tym nie słyszałem, ty bardziej dzięki za poradę – poczytam.
      Dzięki za miłe słowo! 🙂

      Skoro już piszę komentarz, to pochwalę się od razu, że znalazłem w Cleanerze małego buga… Mianowice, nie ładuje on pluginu, jeżeli ten pochodzi z innego komputera (np. jest pobrany z tej strony). Powód? Ponoć coś z zasadami CAS… Doraźnie problem rozwiązuje przejście we właściwości pluginu (dll) i kliknięcie opcji „Odblokuj”. Niemniej jednak w wolnej chwili, będę musiał coś z tym zrobić 🙂

      Pozdrawiam!

      • Najprościej i najdrożej – powinno pomóc podpisanie kodu certyfikatem zaufanego wydawcy. Ostatnio z Addinami do outlook’a miałem ten sam problem.

        • Hmm, no fakt drogie rozwiązanie 😛 Jednak jest chyba inne znacznie tańsze. Zauważyłem, że problem występuje tylko wtedy, kiedy do wypakowania archiwum ZIP, używa się narzędzia wbudowanego w system Windows… Jak wypakuję pliki przez np. 7zip’a to plugin ładuje się jak należy, a pliku dll nie trzeba „odblokowywać”. Ciekawe… Jeszcze tego nie testowałem, ale zapewne stworzenie instalatora programu rozwiąże ten problem zupełnie 😉

          Ach te zabezpieczenia Windowsa… Nie dość, że utrudniają życie to jeszcze są tak… nieskuteczne 😛

Możliwość komentowania jest wyłączona.