Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 9 kwi 2025, o 19:06


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
    Autor Wiadomość
    PostNapisane: 4 paź 2013, o 13:13 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    Często w naszym programie zachodzi konieczność zastosowania zewnętrznych bibliotek
    do różnych celów np do obsługi czegoś tam ... :) tak tak wiem zacząłem z dziwnej strony ...
    niemniej zaraz wszystko stanie się jasne ....


    W zasadzie mamy w przypadku używania zewnętrznych bibliotek x.dll dwie możliwości:

    1. Dodajemy w projekcie Odwołanie do biblioteki i we właściwościach odwołania (reference)
    zaznaczamy żeby była wykonana kopia lokalna

    - spowoduje to że po kompilacji do folderu zostanie zapisany plik dll i będzie można tak jej
    używać z pliku dll z folderu programu .

    Rozwiązanie jest dobre i często się takie stosuje. Niemniej czasem jest mało wygodne , czasem chcemy też by nasz program nie zawierał zbyt wielu plików ....

    Co możemy więc z tym zrobić ??
    -- ano całkiem sporo :)

    W tym poradniku zajmiemy się osadzaniem bibliotek dll w pliku exe.

    Powiecie pewnie jaki ma to cel i sens ....
    No spory - zwłaszcza gdy chcemy by nasz program był przenośny zobaczmy więc co tak naprawdę nam daje ....

    -------- ZALETY

    - ułatwia dystrybucję programu wśród użytkowników jeden plik - zamiast wielu
    - wymagane pliki dll nie zostaną przypadkiem pominięte przez użytkownika ,
    - w przypadku niektórych bibliotek może się pojawić nowa wersja - użytkownik będzie
    wolał pobrać jeden plik niż np ręcznie zmieniać pliki dll.


    Jak widać to dużo , ale metoda ma też wadę może w dobie dzisiejszych komputerów nie aż tak
    istotną , ale jednak...

    - wymaga więcej pracy od programisty i wymusza podjęcie dodatkowych kroków w celu scalenia plików, a keżde nowe wydanie dla danego dll jeśli jest to konieczne w aplikacji wymaga jej przepakowanie ...

    ----------------------------------------------------------------------------------------------

    Osadzanie plików *.dll jest używane przez programy instalatorów powiecie , przecież też są w jednym pliku. Tak to prawda , ale nasza aplikacja nie wymaga instalacji jest za mała , po za tym
    przecież nie robimy tradycyjnego śmietnika na dysku rozrzucając pliki po całym dysku i rejestrze.

    Zróbmy to tak jak powinno się to robić i jak to było wykonywane w porządnych systemach ...


    Dobrze .... zatem stwórzmy nowy projekt i nazwijmy go ... wbudowana_biblioteka
    następnie jakieś biblioteki :

    a niech to będzie np System.Windows.Forms.Ribbon35.DLL z http://officeribbon.codeplex.com
    oraz System.Data.SQLite.DLL z http://system.data.sqlite.org

    to dobra okazja bowiem pierwsza zawiera pakiet komponentów, a druga obsługę bazy danych
    i sie różnią - pierwsza jest zarządzalna , a druga nie :)

    oznacza to że do pierwszej poza wywołaniem funkcji przekazujemy parametry , a z drugiej tylko
    wywołujemy funkcje. Dobra mamy już nasz projekt i biblioteki. i Co teraz ??

    A no nic ...

    gdy już mamy nasz projekt dodajemy odwołanie do naszych bibliotek.
    jest to banalnie proste , klikamy RMB na Odwołania i z meny wybieramy Dodaj odwołanie
    pojawi się nam okienko:

    Obrazek

    gdzie w zakładce przeglądaj wybieramy nasze biblioteki po kolei i klikamy OK ....

    Odwołania mamy z głowy ... pojawiły się ...

    Obrazek

    W zasadzie od teraz możemy już używać w naszym programie już bibliotek o czym wspomniałem na początku
    wymaga to tylko dodania bibliotek do pliku wykonywalnego ... (do ProgDira) co możemy ja wspominałem
    zrobić we właściwościach odwołania :

    Obrazek

    zmieniając wartość pola Kopia lokalna na true -- co spowoduje skopiowanie pliku dll do folderu kompilacji (dołączenie do programu).
    Ale nas to nie interesuje ....mu chcemy nasze biblioteki zaszyć w pliku exe....

    Zatem teraz musimy nasze pliki dll dodać do projektu...
    Możemy to zrobić na 2 sposoby...

    1. kliknąć RMB na nazwie projektu i wybrać dodaj - istniejący element lub Shift-Alt-A i wybrać nasze pliki dll
    2. Przeciągnąć je na projekt np z pulpitu lub lokalizacji projektu i upuścić (drag&drop)

    ma to wyglądać tak:

    Obrazek

    Teraz będzie trudniej ....

    Przede wszystkim w odwołaniu do biblioteki kopia lokalna ma być false -- co widać wyżej .... (nie będziemy kopiować bibliotek)
    Teraz klikamy na naszych plikach DLL w eksploratorze projektu i w ich właściwościach .....

    Obrazek

    Dla obu plików .dll zmieniamy wartość pola Akcja Kompilacji na Zasób osadzony .....:)
    ma to wyglądać dokładnie jak widzicie wyżej...

    Uffff ... to tyle ....


    no nie żartowałem ... fakt po kompilacji nasze biblioteki zostaną dołączone do pliku exe, ale nie będą używane i nie zadziała nasz program na kompie bez tych bibliotek ....

    Zróbmy więc cokolwiek co zawierają nasze libsy na formie1.

    Obrazek

    np tak .... dodamy panel z biblioteki Ribon

    i sami sprawdźcie ... po kompilacji że bez bibliotek wasz program nie działa .... no bo niby jak co ..
    przecież poza tym ze dodaliśmy je do pliku program nie wie gdzie są i jak je użyć ....

    no to do roboty.....

    Nasze zadanie jest proste ... musimy podczas uruchomienia programu wypakować biblioteki i załadować do programu ...

    Szukamy w projekcie pliku Program.cs (zawiera on podstawową klase naszego programu) i otwieramy go:

    tam znajdujemy funkcję main()

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    jak widać całość jest jasna ...
    i dopisujemy ładowanie naszych dll do ram....

    co powinno wyglądać tak :)

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Używamy jak widać metody PaczkaDll.Load by załadować nasze wbudowane biblioteki do pamięci RAM. Zwróćcie też uwagę na format ciągu zasobów:

    Wbudowana_biblioteka.System.Data.SQLite.dll

    Ciąg ten to jakby adres naszego zasobu. Zawiera nazwę naszego projektu i pliku DLL. trzeba na to uważać gdyż jeśli chcemy np dodać biblioteki w folderze np DLLe to ta nazwa folderu musi byc też uwzględniona w adresie. Ale tu dodajemy tylko czyste pliki dll... niemniej jeśli trzeba to powinno to wyglądać tak:

    nazwa_aplikacji.nazwa_folderu.System.Data.SQLite.dll

    zdarzenie AppDomain.CurrentDomain.AssemblyResolve.. jest przydatne w wypadku gdy biblioteki nie mogą być zlokalizowane przez aplikację do dystrybucji. AssemblyResolve wywołuję żądanie plików DLL
    których brakuje. Musimy więc jej powiedzieć że nasze biblioteki są w pamięci RAM, w tym celu użyjemy metody PaczkaDll.Get by pobrać biblioteki z pamięci i przekazać je do AssemblyResolve, który obsłuży całą resztę ...

    a więc dopiszmy jeszcze kawałek kodu pod funkcją main()

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    a cały nasz plik Program.cs powinien wyglądać np tak:



    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    I to by było na tyle ?? -


    tak i nie ... gdyż potrzeba nam jeszcze stworzyć klasę PaczkaDll.

    w tym celu do naszego projektu dodajemy nową klasę (Shift-Alt-C) i nazywamy ją PaczkaDll.cs
    otwieramy plik i w nim umieszczamy kod:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Powyższy kod zawiera metody ładowania plików DLL które będą używane z .Net
    A musimy wiedzieć że mamy dwa typy plików Dll

    - Zarządzane DLL
    - Niezarządzalne DLL lub Mixed Code DLL

    dlatego też procedury ładowania sa odmienne ...


    W przypadku zarządzalnych DLL procedura ładowania jest prosta i można ją zrealizować np tak:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Ale biblioteki niezarządzalnej nie możemy załadować bezpośrednio do tablicy byte[] tak jak zarządzalnej
    tu musimy:

    1. najpierw załadować osadzoną bibliotekę do tablicy byte[]
    2. zapisać zawartość tablicy byte[] do fizycznego pliku i przechować w folderze temp
    3. użyć metody loadFile() by załadować plik do pamieci

    co opisałem w komentarzach w kodzie PaczkaDLL.. która to będzie wstępnie ładować wymagane biblioteki DLL i przechowywać je wewnątrz "Słownika", a gdy nastąpi ewent AssembyResolve metoda PaczkaDll.Get()
    zwróci żądaną bibliotekę.

    Miłej zabawy z osadzaniem plików....

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 paź 2013, o 14:54 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 14 lut 2012
    Posty: 598
    Lokalizacja: Warszawa
    Pomógł: 13

    Hehee no to teraz już wiem czemu tak cicho siedziałeś ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 paź 2013, o 14:58 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27369
    Lokalizacja: Szczecin
    Pomógł: 1043

    Kurczę kiedy ja będę miał czas .... przeorać te wszystkie ŚWIETNE poradniki ;) ... kolejne cacuszko do kolekcji ;) DZIĘKI SUN !

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 paź 2013, o 16:57 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    E tam nic wielkiego przecież ....

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO