.Net Compact Framework suporta Platform Invoke (P/Invoke). Acest serviciu permite codului managed sa apeleze functii unmanaged care se afla ind dll-uri. P/Invoke exista si in .Net Framework, bineinteles, cu diferente fata de cel din .Net Compact Framework.
Subiectul acestui articol nu il reprezinta prezentarea P/Invoke, asa ca voi rezuma modul de folosire.
In primul rand, la design time, trebuie sa specificam ce functie unmanaged vrem sa apelam. Pentru ca in acest articol, vom crea o aplicatie care sa apeleze un numar de telefon, vom scrie urmatorul cod:
[DllImport("phone.dll")] private static extern IntPtr PhoneMakeCall(ref PhoneMakeCallInfo ppmci);
Urmeaza mai tarziu, apelul metodei si tratarea eventualelor exceptii.
Fisierul Phone.cs pe care il vom adauga in solutia noastra, va contine clasa Phone, ai carei membri ne vor ajuta sa apelam un numar de telefon. Fisierul poate fi descarcat la finalul articolului.
Dupa adaugarea, compilam. Primim eroare:
Unsafe code may only appear if compiling
Fragmentele de cod care sunt cu unsafe sunt valide doar cand sunt compilate cu /unsafe.
Vom seta ca la Build aceste secvente de cod sa fie validate.
Vom intampina o eventuala eroare la runtime, de genul:
System.MissingMethodException was unhandled
Message="Can’t find PInvoke DLL ‘phone.dll’."
Pe fisierul adaugat, dam click dreapta, Properties si optiunea Copy always pentru Copy to Output Directory.
Urmatoare problema de care m-am lovit cand am incercat sa apelez un numar de telefon a fost faptul ca nu avem acces la reteaua telefonului.
A wireless radio must be attached to use the phone.
Pornim Cellular Emulator care a fost instalat o data cu Windows Mobile SDK. Il gasim in Start/All Programs/Windows Mobile 6 SDK/Tools.
- Identificam configuratia portului COM.
- Configuram emulatorul folosind informatia aflata anterior. Daca nu exista numele portului, il scriem manual.
- Resetam softul emulatorului.
In acest moment, ar trebui sa avem retea.:)
In cazul in care, dupa parcurgerea acestor pasi nu ati reusit sa va conectati, incercat sa restartati Cellular Emulator si chiar sa il resetati (in sectiunea de Configuration are un buton de Reset).
Vom face un mic test pentru apelare. Formam un numar si apasam tasta de apel.
Apelul se va produce:
In continuare, vom continua dezvoltarea aplicatiei, care va apela un numar de telefon. Vom avea nevoie de un textbox pentru introducerea unui numar de telefon si de un buton care sa efectueze apelul.
Efectuarea unui apel este o operatie de baza. Transmite metodei PhoneMakeCall(Win32 API) un parametru de tip string care va indica destinatia apelului. Totodata, aceasta metoda mai accepta un parametru care va confirma efectuarea apelului inainte de a fi efectuat.
Metoda apelata va fi:
Microsoft.Wireless.Phone.MakeCall(txtNrTel.Text.ToString());
Putem observa in Cellular Emulator in sectiunea Call Manager apelul pe care l-am primit si cum va reactiona la diferite situatii (raspuns de ocupat, inchis, fara raspuns).
Daca dorim simularea unui apel pe care il vom primi, tot in aceasta sectiune, putem folosi optiunea Call to Device. Introducem numarul de telefon si apasam Dial.
Ca test, vom avea:
P/Invoke furnizeaza un set foarte bogat de functionalitati cu care se pot folosi foarte usor dll-urile de care aplicatia pe care dorim sa o construim are nevoie.
In articolul urmator, vom arata cum vom simula trimiterea de sms-uri.
Codul sursa asociat poate fi downloadat aici.
Jean Valjean says:
As vrea sa te intreb daca codul prezentat de tine va mai functiona pe platforma viitoare Windows Phone 7 ? Din cate am inteles dezvoltarea va fi pe Silverlight si nu va fi compatibilitate inapoi.
zeltera says:
Nu am testat pe windows phone 7. Insa ar trebui sa functioneze. De obicei codul scris pe versiuni vechi ruleaza pe versiuni noi. Insa, repet, nu am testat. Poate o sa urmeze si o serie de tutoriale cu specific WM7.
Pingback/Trackback
SMS in .Net CE | by zeltera