Are sens, având toate fericirea C #-gestionate, să se întoarcă în fereastra de programare Petzold și să încerce să producă cod cu WinAPI pur?
Ce poate fi învățat din ea? Nu este prea depășit pentru a fi util?
Absolut. Când nimeni nu știe nivelul scăzut, cine va actualiza și scrie limbile de nivel înalt? De asemenea, atunci când înțelegeți chestiile de nivel scăzut, puteți scrie un cod mai eficient într-un limbaj de nivel superior și, de asemenea, puteți depana mai eficient.
Am văzut codul API de nivel scăzut al Windows ... nu este destul ... Mi-aș dori să-l pot dezvălui. Cred ca este benefic pentru a invata un nivel scazut ca in C, pe masura ce obtineti o mai buna intelegere a arhitecturii hardware si cum functioneaza toate aceste lucruri. Învățând vechiul API Windows ... Cred că lucrurile pot fi lăsate oamenilor de la Microsoft care ar putea fi nevoiți să-l învețe pentru a construi limbi de nivel superior și API ... au construit-o, să-i lase să sufere cu asta ;-)
Cu toate acestea, dacă se întâmplă să găsești o situație în care simți că nu poți să faci ceea ce trebuie să faci într-un limbaj de nivel mai înalt (puțini și departe între ei), atunci poate începe scufundarea periculoasă în lumea asta.
API-urile native sunt API-urile "real" ale sistemului de operare. Biblioteca .NET este (cu câteva excepții) nimic mai mult decât un ambalaj elegant în jurul lor. Deci, da, aș spune că oricine poate înțelege .NET cu toată complexitatea sa, poate înțelege lucruri relativ bizare, cum ar fi vorbit cu API fără beneficiul unui om de mijloc.
Doar încercați să faceți DLL Injecție din codul gestionat. Nu se poate face. Veți fi nevoiți să scrieți un cod nativ pentru acest lucru, pentru trucuri de ferestre, pentru o subclasare reală și pentru o duzină de alte lucruri.
Deci da: trebuie să știți amândouă.
Editați: chiar dacă intenționați să utilizați P / Invoke.
Această întrebare se învecinează cu religia :) Dar oricum voi da gândurile mele.
Eu văd valoarea în folosirea Win32 API. Cele mai multe, dacă nu toate, bibliotecile GUI (gestionate sau neadministrate) generează apeluri către API-ul Win32. Chiar și cele mai complete biblioteci nu acoperă 100% din API și, prin urmare, există întotdeauna lacune care trebuie să fie conectate prin apeluri API directe sau P / invocând. Unele nume ale agregatelor din jurul apelurilor API au nume similare cu apelurile API care stau la baza, dar aceste nume nu sunt autocumentante. Așa că înțelegerea API-ului subiacent și terminologia utilizată în ea vor ajuta la înțelegerea API-urilor de înfășurare și la ceea ce fac de fapt.
În plus, dacă înțelegeți natura API-urilor de bază care sunt utilizate de cadre, atunci veți face alegeri mai bune în ceea ce privește funcționalitatea bibliotecii pe care ar trebui să o utilizați într-un anumit scenariu.
Noroc!
Analogie: Dacă construiți mașini pentru a trăi (programare), atunci este foarte pertinent să știți cum funcționează motorul (Win32).
Răspuns simplu, DA.
Learning a new programming language or technology is for one of three reasons:
1. Need: you're starting a project for building a web application and you don't know anything about ASP.NET
2. Enthusiasm: you're very excited about ASP.NET MVC. why not try that?
3. Free time: but who has that anyway.
Cel mai bun motiv pentru a afla ceva nou este Need. Dacă aveți nevoie să faceți ceva ce nu poate face cadrul .NET (cum ar fi performanța, de exemplu), atunci WinAPI este soluția dvs. Până atunci, ne ocupăm de învățarea despre .NET
Este important să știți ce este disponibil cu API-ul Windows. Nu cred că trebuie să scoți codul cu el, dar ar trebui să știi cum funcționează. .NET Framework conține o mulțime de funcționalități, dar nu oferă echivalente de cod gestionat pentru întregul API Windows. Uneori trebuie să te apropii mai mult de metal și știind ce este acolo și cum se comportă, îți va oferi o mai bună înțelegere a modului de utilizare.
Pentru majoritatea nevoilor de pe desktop, nu trebuie să știți Win32, cu toate acestea, există o mulțime de Win32 nu în. NET, dar este în lucrurile de expediere care pot ajunge mai puțin de 1% din cererea dumneavoastră.
Suport USB, suport HID, Windows Media Foundation chiar în partea de sus a capului meu. Există multe aplicații cool API disponibile doar de la Win32.
Veți face o mare favoare prin a învăța cum să faceți interop cu un Win32 API, dacă faceți programare desktop, pentru că atunci când trebuie să apelați Win32 și nu veți petrece săptămâni să vă zgâriați capul.
Presupunând că construiți aplicații orientate spre Windows:
On the assumption that you're building apps for the "Web 2.0" world, or that would be just as useful/beneficial to *NIX & MacOS users:
Personal nu îmi place foarte mult API-ul Win32, dar există o valoare în învățarea lui, deoarece API va permite mai mult control și eficiență folosind GUI decât un limbaj ca Visual Basic și cred că dacă vei face un software de scris trebuie să cunoașteți API chiar dacă nu îl utilizați direct. Acest lucru se întâmplă din motive similare cu motivele pentru care este bine să înveți C, cum ar fi modul în care un strat strcpy necesită mai mult timp decât copierea unui întreg sau de ce ar trebui să folosiți pointerii în matrice ca parametri funcționali în loc de array după valoare.
Acest lucru este la fel ca întrebarea, ar trebui să învăț un limbaj de nivel scăzut cum ar fi C (sau chiar asamblare).
Codificarea în ea este, cu siguranță, mai lentă (desigur că rezultatul este mult mai rapid), dar adevăratul ei avantaj este că veți obține o înțelegere a ceea ce se întâmplă aproape de nivelul sistemului, mai degrabă decât să înțelegeți metafora altcuiva despre ceea ce se întâmplă .
De asemenea, poate fi mai bine atunci când lucrurile nu vor funcționa bine, sau destul de repede sau cu felul de granularitate de care aveți nevoie. (Și faceți cel puțin unele subclasări și superclasări.)
M-am ținut la standardul C / C ++ de ani de zile înainte de a învăța Win32 API, și pentru a fi destul de blunt, "învățarea Win32 API" parte nu este cea mai bună experiență tehnică din viața mea.
Într-o mână Win32 API este destul de rece. Este ca o extensie a API-ului standard C (care are nevoie de fopen
atunci cand poti avea CreateFile
) dar cred ca UNIX / Linux / WhateverOS au aceleasi functii gizmo. Unix / Linux, ei au "Totul este un fișier". În Windows, ei au "Totul este un ... fereastră" (nu glumesc!
Pe de altă parte, acesta este un API moștenit. Veți avea de-a face cu C brut, și nebunia C prime.
void *
la o anumită funcție Win32. ștergeți acest lucru;
într-o metodă de clasă). În ultima mână ( trei mâini ), luați în considerare faptul că unii oameni care lucrează cu API-uri vechi utilizează ei înșiși stilul de cod vechi. Momentul în care auziți că " const
este pentru manechine " sau " Nu folosesc spații de nume pentru că diminuează viteza de rulare mai bine " Hei, cine are nevoie de C ++? Cod în propria mea marcă de obiecte orientate C !!! " (Nu glumesc ... Într-un mediu profesional, iar rezultatul a fost destul de o vedere .. .), veți simți un fel de groază condamnat numai în fața ghilotina .
Deci ... În ansamblu, este o experiență interesantă .
După ce am citit din nou acest post, văd că ar putea fi considerat prea negativ. Nu este.
Este uneori interesant (precum și frustrant) să știi cum funcționează lucrurile sub capotă. Veți înțelege că, în ciuda constrângerilor enorme (imposibil?), Echipa Win32 API a făcut o treabă minunată pentru a fi siguri că totul, de la dvs. "programul Win16" până la "ultima aplicație Win64 over-the-top" în trecut, acum și în viitor.
Întrebarea este: Chiar vrei să?
Deoarece petrecerea săptămânilor pentru a face lucruri care ar putea fi realizate (și realizate mai bine) în alte API-uri mai înalte și / sau orientate pe obiect pot fi destul de motivaționale (experiență reală: 3 săptămâni pentru Win API, 4 ore în trei alte limbi și / sau biblioteci).
Oricum, veți găsi blogul lui Raymond Chen foarte interesant din cauza viziunii lui insider pe ambele Win API și evoluția sa prin ani:
O voi pune așa. Nu-mi place programarea la API-ul Win32. Poate fi o durere în comparație cu codul gestionat. BUT, mă bucur că știu asta pentru că pot scrie programe care altfel nu aș putea. Pot scrie programe pe care alte persoane nu le pot face. În plus, vă oferă o mai bună înțelegere a ceea ce face codul dvs. gestionat în spatele scenei.
Valoarea de valoare pe care o obțineți din învățarea API-ului Win32 (în afară de tipurile de informații generale pe care le obțineți despre învățarea cum se potrivesc nucile și bolțurile mașinii) depinde de ceea ce încercați să obțineți. O mulțime de API-ul Win32 a fost înfășurat frumos în clasele .NET ale bibliotecii, dar nu toate. Dacă, de exemplu, căutați să faceți o serie de programe audio grave, acea parte a API-ului Win32 ar fi un subiect excelent de studiu, deoarece doar clasele de bază sunt disponibile din clasele .NET. Ultima dată am verificat chiar că biblioteca directă DirectSound administrată a fost groaznică.
Cu riscul auto-promovării nerușinate ....
Tocmai am dat peste o situație în care API-ul Win32 a fost singura mea opțiune. Vreau să fiu foarte diferit pe fiecare articol într-o listă. Am scris cum am făcut-o pe această întrebare .