Tworzenie projektu C# z wykorzystaniem Biblioteki ASM Krok po kroku.
Dzięki temu tutorialowi nauczysz się jak utworzyć prosty interfejs graficzny w C#, który będzie wykorzystywał funkcję zdefiniowane w bibliotece napisanej w asemblerze. Tego typu rozwiązanie może przydać się do obsługi np. filtrów graficznych, bądź wykonywania skomplikowanych obliczeń matematycznych. Pisanie GUI w asemblerze nie ma większego sensu, dlatego warto wykorzystać do tego języki wysokiego poziomu, a asemblerowi zostawić zaawansowaną logikę naszej aplikacji. Mam nadzieję, że wszystko w tym tutorialu okaże się jasne i zrozumiałe.
Tutorial pokazuje tworzenie tego typu aplikacji w środowisku Visual Studio 2010. W Visual Studio 2012 wszystkie kroki są identyczne.
Zaczynamy. (tutorial możesz też pobrać w wersji PDF: https://dl.dropbox.com/u/5532105/C%23_i_AsmDLL_tutorial.pdf)
1. Tworzymy nowy projekt C#, WindowsFormsApplication Projekt nazwijmy GUI, natomiast solucji nadajmy nazwę GUI_i_ASM
2. Do solucji dodajemy nowy projekt wybierając C++/General/Empty i nazywamy go BibliotekaASM:
3. Do projektu BibliotekaASM dodajmy nowy plik źródłowy, który nazywamy biblioteka.asm
I umieśćmy w nim przykładowy kod:
W tym pliku będziemy pisać kod naszej asemblerowej funkcji. Powyższa funkcja odejmuje dwie liczby (także zmiennoprzecinkowe), wykorzystując do tego koprocesor arytmetyczny. Nad sensem pisania takiej procedury w asemblerze nie będziemy dyskutować;)
4. Dodajemy w taki sam sposób jak poprzednio jeszcze jeden plik źródłowy, który nazywamy biblioteka.def i również piszemy w nim kod
LIBRARY "biblioteka"
EXPORTS
licz
Ten plik jest odpowiedzialny za wyeksportowanie nagłówków funkcji z asemblera. Jeśli utworzylibyśmy więcej procedur, to po prostu ich nazwy wypisujemy w kolejnych linijkach.
5. We właściwościach projektu BibliotekaASM klikamy Build Costumization i zaznaczamy haczyk przy MASM, po czym kilkamy OK.
6. We właściwościach pliku biblioteka.asm w zakładce General, ustawiamy Item Type na Microsoft Macro Assembler.
7. Klikamy prawym na nazwę solucji i wybieramy Project Dependencies. Z listy projektów wybieramy GUI i zaznaczamy haczyk przy BibliotekaASM. Ta czynność jest odpowiedzialna za poprawną kolejność budowania aplikacji. Pierwsze zostanie skompilowana biblioteka, a następnie aplikacja okienkowa.
8. Teraz czas na ustawienie właściwości projektu BibliotekaASM tak, aby się poprawnie skompilował. Wchodzimy we właściwości projektu
W zakładce Configuration Properties/General:
- Zmieniamy ścieżkę generowania pliku wyjściowego na tą do której będzie kompilowany plik .exe naszego GUI. W naszym wypadku jest to ..\GUI\bin\Debug. Dzięki tej operacji aplikacja nie będzie szukać potrzebnej do uruchomienia biblioteki. (Jeśli projekt robilibyśmy w wersji Release, ścieżka zmieniłaby się w ..\GUI\bin\Release)
- zmieniamy Target Extension na .dll
- Configuration Type na Dynamic Library (.dll)
W zakładce Configuration Properties/General/Linker/Input
- w Module Definition File wpisujemy biblioteka.def
W zakładce Configuration Properties/General/Linker/System
- ustawiamy Subsystem na Windows(/SUBSYSTEM:WINDOWS)
W zakładce Configuration Properties/General/Linker/Advance
- ustawiamy pole No Entry Point na Yes(/NOENTRY)
Dzięki temu kompilator nie będzie wołał do nas o główną procedurę programu, co przy tworzeniu biblioteki jest nam przecież zbędne. I to chyba wszystko, co musimy ustawić. Dodatkowe info: Jeśli chcielibyśmy korzystać z dodatkowych bibliotek dla asemblera, to w w Linker/Additional Library Directories, trzeba podać ścieżkę do folderu, który je zawiera.
9. Jeśli poprawnie wszystko zrobiliśmy, możemy dać Build na projekcie BibliotekaASM i nasza biblioteka powinna się skompilować bez problemów.
10. Teraz zajmijmy się naszym GUI w C#. Aby móc podłączyć bibliotekę trzeba będzie zezwolić na pisanie kodu z dyrektywą unsafe. W tym celu klikamy na właściwości projektu GUI i w zakładce Build stawiamy haczyk przy Allow unsafe code. Zapiszmy zmiany klikając ctrl+s.
11. Do komunikacji z Biblioteką napisaną w Asemblerze wykorzystamy nową osobną klasę. Tworzymy ją klikając prawym przyciskiem myszy na projekt i wybierając /add/class.
Klasę nazwijmy FunkcjeAsemblera.
Po utworzeniu możemy nie zapomnijmy o:
- dołączeniu biblioteki pozwalającej importować funkcję z dll. W tym celu w kodzie wpisujemy using System.Runtime.InteropServices
- dodaniu w kodzie przed nazwą klasy dyrektywy unsafe. Kod klasy wygląda, więc następująco:
12. Teraz utwórzmy sobie nasz interfejs graficzny. Klikamy dwukrotnie na Form1.cs i pojawia nam się przygotowane Windowsowe okienko. (Jeśli pojawił się kod, to do designera można przełączyć się przy użyciu klawisza F7)
13. Z toolboxa przesuwamy sobie na nasze okienko 3 TextBoxy i jeden Button.
- Dla trzeciego textboxa zmieńmy w okienku Properties wartość pola Enabled na False. Będziemy go używać do wyświetlenia wyniku, wiec możliwość wpisywania danych przez użytkownika nie jest nam w nim potrzebna.
- Dla buttona zmieńmy pole text na "Policz".
14. Teraz dwukrotnie kliknijmy nasz przycisk, co powinno utworzyć w kodzie metodę obsługi kliknięcia, w której będziemy wywoływać naszą asemblerową funkcję.
Umieszczamy Kod:
15. Zapisujemy, kompilujemy, w uruchomionym programie wpisujemy liczby i sprawdzamy czy wszystko działa.
I solucja do pobrania: http://www.speedyshare.com/9zdDh/GUI-i-ASM.rar












