Имеет ли смысл, имея все С# -управляемое блаженство, вернуться к программированию Windows Petzold и попытаться создать код с чистым WinAPI?
Что можно узнать из него? Разве это не слишком устарело, чтобы быть полезным?
Имеет ли смысл, имея все С# -управляемое блаженство, вернуться к программированию Windows Petzold и попытаться создать код с чистым WinAPI?
Что можно узнать из него? Разве это не слишком устарело, чтобы быть полезным?
Этот вопрос граничит с религиозными:) Но я все равно дам свои мысли.
Я вижу ценность при использовании Win32 API. Большинство, если не все, GUI-библиотеки (управляемые или неуправляемые) приводят к вызовам API Win32. Даже самые полные библиотеки не покрывают 100% API, и, следовательно, всегда есть пробелы, которые необходимо подключать прямыми вызовами API или P/invoking. Некоторые имена оберток вокруг вызовов API имеют похожие имена для вызовов API, но эти имена не совсем самодокументированы. Поэтому понимание базового API и используемой в нем терминологии поможет понять интерфейсные API-интерфейсы и то, что они на самом деле делают.
Кроме того, если вы понимаете природу базовых API-интерфейсов, которые используются в рамках фреймворков, тогда вы сделаете лучший выбор в отношении того, какую библиотечную функциональность вы должны использовать в данном сценарии.
Ура!
Я долгое время занимался стандартным C/С++, прежде чем изучать API Win32, и, чтобы быть довольно тупым, часть "обучения Win32 API" не является лучшим техническим опытом в моей жизни.
В одной руке Win32 API довольно круто. Это похоже на расширение стандартного API C (которому требуется fopen
, когда у вас может быть CreateFile
). Но я думаю, что UNIX/Linux/WhateverOS имеют одни и те же функции gizmo. В любом случае, в Unix/Linux у них есть "Everything is файл". В Windows у них есть "Все есть... Окно" (не шутите! См. CreateWindow
!).
С другой стороны, это устаревший API. Вы будете иметь дело с сырым C и сырым C безумием.
void *
на некоторую функцию Win32.delete this ;
в методе класса).В последней руке (три руки???), подумайте, что некоторые люди, работающие с устаревшими API, сами используют устаревший стиль кода. В тот момент, когда вы слышите " const
для манекенов" или ", я не использую пространства имен, потому что они уменьшают скорость выполнения" или даже лучше " Эй, кому нужен С++? Я код в своем собственном бренде объектно-ориентированного C!!!" (Не шучу... В профессиональной среде, и результат был довольно зрелищным...) я чувствую, что только страх только осужденный чувствует перед guillotine.
Итак... В общем, это интересный опыт.
После повторного чтения этого сообщения я вижу, что это можно рассматривать как слишком негативное. Это не так.
Иногда интересно (а также расстраивать) знать, как все работает под капотом. Вы поймете, что, несмотря на огромные (невозможные?) Ограничения, команда Win32 API сделала замечательную работу, чтобы убедиться, что все, от вас "olde Win16 program" до вашего "последнего приложения Win64 over-top", может работать вместе, в прошлом, сейчас и в будущем.
Вопрос: Вы действительно хотите?
Поскольку проводить недели, чтобы делать то, что может быть сделано (и сделано лучше) в других более высокоуровневых и/или объектно-ориентированных API, может быть довольно де-мотивационным (реальный жизненный опыт: 3 недели для Win API, против 4 часов на трех других языках и/или библиотеках).
В любом случае, вы обнаружите, что блог Raymond Chen очень интересен из-за его внутреннего взгляда на Win API и его эволюцию на протяжении многих лет:
Собственные API-интерфейсы являются "реальными" API-интерфейсами операционной системы. Библиотека .NET(за небольшим исключением) является не чем иным, как причудливой оберткой вокруг них. Так что да, я бы сказал, что любой, кто может понять .NET со всей его сложностью, может понять относительно мирские вещи, такие как разговор с API без выгоды среднего человека.
Просто попробуйте выполнить DLL-инъекцию из управляемого кода. Это невозможно. Вам придется писать собственный код для этого, для настройки окна, для реального подкласса и еще десятка других вещей.
Итак, да: вы должны (должны) знать оба.
Изменить: даже если вы планируете использовать P/Invoke.
Совершенно верно. Когда никто не знает низкий уровень, кто будет обновлять и писать языки высокого уровня? Кроме того, когда вы понимаете материал низкого уровня, вы можете писать более эффективный код на языке более высокого уровня, а также отлаживать более эффективно.
В предположении, что вы создаете приложения, ориентированные на Windows:
В предположении, что вы создаете приложения для мира "Web 2.0", или это было бы так же полезно и полезно для пользователей NIX и MacOS:
Аналогия: Если вы строите автомобили для жизни (программирование), то очень важно знать, как работает двигатель (Win32).
Простой ответ, YES.
Это ответ на любой вопрос, который похож на... "имеет ли смысл изучать язык низкого уровня /api X, даже когда на языке более высокого уровня /api Y есть
Да
Вы можете загрузить свой ПК с ОС Windows (или любую другую ОС) и задать этот вопрос в SO, потому что пара ребят из Microsoft написала 16-битный ассемблерный код, который загружает вашу ОС.
Ваш браузер работает, потому что кто-то написал ядро ОС на C, которое обслуживает все ваши запросы в браузере.
Это полностью соответствует языкам сценариев.
Большой или маленький, всегда есть рынок и возможность писать что-то на любом уровне абстракции. Вам просто нужно понравиться и вписаться в правильную работу.
Нет api/language на любом уровне абстракции не имеет значения , если нет лучшего конкурента на том же уровне.
Еще один способ взглянуть на это: хороший пример из одной из книг Майкла Абраша: программисту С было поручено написать функцию для очистки экрана. Поскольку C была лучшей (более высокой) абстракцией по сборке и всем, программист знал только C и хорошо знал. Он сделал все возможное - он переместил курсор в каждое место на экране и очистил там персонажа. Он оптимизировал цикл и убедился, что он работает так быстро, как только может. Но все же это было медленно... пока не появился какой-то парень и сказал, что есть какая-то инструкция BIOS/VGA или что-то, что может сразу очистить экран.
Это всегда помогает узнать, что вы ходите.
Да, по нескольким причинам:
1).net обертывает код Win32..net - это, как правило, превосходная система для кодирования, но с некоторыми знаниями о базовом слое Win32 (oops, WinAPI теперь, когда есть и 64-битный код) помогает вам узнать, что на самом деле происходит.
2) в этой экономике лучше иметь некоторые преимущества перед другим парнем, когда вы ищете работу. Некоторые возможности WinAPI могут предоставить вам это.
3) некоторые системные аспекты еще не доступны через инфраструктуру .net, и если вы хотите получить доступ к этим функциям, вам нужно будет использовать p/invoke (см. http://www.pinvoke.net для некоторой помощи там). Наличие хотя бы небольшого количества опыта WinAPI сделает ваши усилия p/invoke более эффективными.
4) (добавлено) Теперь, когда Win8 существует уже некоторое время, он все еще построен поверх WinAPI. iOS, Android, OS/X и Linux - все там, но WinAPI все еще будет там много лет.
Изучение нового языка или технологии программирования по одной из трех причин:
1. Нужна: вы начинаете проект по созданию веб-приложения, и вы ничего не знаете об ASP.NET
2. Энтузиазм: вы очень взволнованы ASP.NET MVC. почему бы не попробовать?
3. Свободное время: но у кого это все равно.
Лучшей причиной для изучения чего-то нового является Need. Если вам нужно сделать что-то, что .NET framework не может сделать (например, производительность), то WinAPI - это ваше решение. До тех пор мы продолжаем заниматься чтением .NET.
Для большинства потребностей на рабочем столе вам не нужно знать Win32, однако LOT Win32 не в .NET, но он находится в затратах, которые могут оказаться менее 1% вашего приложения.
Поддержка USB, поддержка HID, Windows Media Foundation у меня на голове. Существует много интересных API Vista, доступных только от Win32.
Вы сделаете себе большую услугу, научившись взаимодействовать с Win32 API, если вы будете программировать на рабочем столе, потому что, когда вам нужно позвонить в Win32, и вы это сделаете, вы не потратите недели, царапая себе голову.
Лично мне не очень нравится Win32 API, но есть смысл изучать его, поскольку API позволит больше контролировать и эффективно использовать GUI, чем язык, такой как Visual Basic, и я считаю, что если вы собираетесь сделать вы должны знать API, даже если вы не используете его напрямую. Это по причинам, аналогичным причинам, которые полезно изучать C, например, как strcpy занимает больше времени, чем копирование целого числа, или почему вы должны использовать указатели на массивы в качестве функциональных параметров вместо массивов по значению.
Обучение C или язык более низкого уровня может быть определенно полезен. Однако я не вижу очевидного преимущества при использовании неуправляемого WinAPI.
Я видел низкоуровневый код Windows API... он не очень... Мне жаль, что я не смогу его отучить. Я думаю, что это полезно для изучения низкого уровня, как на C, поскольку вы лучше понимаете аппаратную архитектуру и как все это работает. Изучение старого API Windows... Я думаю, что материал может быть оставлен для людей в Microsoft, которым, возможно, потребуется изучить его для создания языков более высокого уровня и API... они построили его, пусть они страдают вместе с ним; -)
Однако, если вам случится найти ситуацию, когда вы чувствуете, что просто не можете делать то, что вам нужно делать на языке более высокого уровня (немного и далеко), тогда, возможно, начните опасное погружение в этот мир.
да. посмотрите на uTorrent, удивительную часть эффективности программного обеспечения. Половина его небольшого размера объясняется тем, что большая часть его основных компонентов была переписана, чтобы не использовать библиотеки gargatuian.
Большая часть этого не может быть выполнена без понимания того, как эти библиотеки взаимодействуют с API-интерфейсом более низкого уровня
Важно знать, что доступно в Windows API. Я не думаю, что вам нужно прокрутить код, но вы должны знать, как это работает..NET Framework содержит множество функциональных возможностей, но не содержит управляемых эквивалентов кода для всего API Windows. Иногда вам нужно немного приблизиться к металу, и, зная, что там и как оно себя ведет, вы сможете лучше понять, как его использовать.
Это действительно то же самое, что и вопрос, должен ли я изучать язык низкого уровня, такой как C (или даже ассемблер).
Кодирование в нем, конечно, медленнее (хотя, конечно, результат намного быстрее), но его истинное преимущество заключается в том, что вы получаете представление о том, что происходит на уровне системы, а не просто понимаете другую метафору для чего продолжается.
Также может быть лучше, когда все будет не так хорошо, или достаточно быстро, или с той степенью детализации, которая вам нужна. (И, по крайней мере, некоторые подклассы и суперклассы.)
Я скажу так. Мне не нравится программирование API Win32. Это может быть боль по сравнению с управляемым кодом. НО, я рад, что знаю это, потому что я могу писать программы, которые иначе я бы не смог. Я могу писать программы, которые другие люди не могут. Плюс это дает вам больше информации о том, что ваш управляемый код делает за кулисами.
Объем стоимости, которую вы получаете от изучения Win32 API, (за исключением общих сведений, которые вы узнаете от того, как сочетаются гайки и болты машины), зависит от того, чего вы пытаетесь достичь. Многие API-интерфейсы Win32 хорошо дополняются классами библиотеки .NET, но не все. Если, например, вы хотите сделать серьезное аудиопрограммирование, эта часть Win32 API станет отличным предметом изучения, потому что из классов .NET доступны только самые основные операции. Последнее, что я проверил, даже управляемая DirectX DirectSound библиотека была ужасной.
С риском бесстыдной саморекламы....
Я просто столкнулся с ситуацией, когда Win32 API был моим единственным вариантом. Я хочу иметь разные подсказки для каждого элемента в списке. Я написал, как я это сделал на этом вопросе.
Даже на очень высокоуровневых языках вы все равно используете API. Зачем? Ну, не каждый аспект API был реплицирован различными библиотеками, фреймами и т.д. Вам нужно изучить API до тех пор, пока вам понадобится API для выполнения того, что вы пытаетесь сделать. (И больше нет.)
Помимо некоторых особых случаев, когда вам нужен прямой доступ к API, я бы сказал НЕТ.
Требуется значительное время и усилия, чтобы научиться правильно реализовывать собственные API-вызовы, а возвращаемое значение просто не стоит. Я бы предпочел потратить время на изучение новых горячих технологий или фреймворков, которые сделают вашу жизнь проще и программируют менее болезненно. Не многолетние устаревшие библиотеки COM, которые никто больше не использует (извините пользователей COM).
Пожалуйста, не качайте меня за эту точку зрения. Я знаю, что у многих инженеров есть действительно любопытные души, и нет ничего плохого в том, как учиться, как все работает. Любопытство хорошее и действительно помогает понять. Но с управленческой точки зрения я предпочел бы потратить неделю на изучение разработки приложений для Android, чем называть OLE или COM.
Если вы планируете разрабатывать кросс-платформенное приложение, если вы используете win32, то ваше приложение может легко запускаться через linux через WINE. Это приводит к высокому обслуживанию. Это одно из преимуществ обучения win32.