Консольным приложением не был создан файл prototype
Вы придумали мобильное приложение, которое определяет по фото, будет ли вкусной картошка фри, или выдает классный ответ на неприятную фразу незнакомца. Что дальше? Сделать простое приложение стоит от 3 тысяч долларов. Прежде чем искать деньги, попробуйте сделать прототип вашей идеи. Так можно проверить, нужен ли ваш продукт аудитории. Даже если вы не умеете программировать, можно использовать сервисы для сборки прототипа приложений.
В статье мы расскажем, какие есть сервисы, сколько стоит сделать прототип и на что обратить внимание при выборе.
Прототип — средство быстрой визуализации вашей идеи. Его можно показать заказчику или пользователю. Идею можно даже набросать на салфетке, но это не особо наглядно: пользователь мало что поймет, а разработчику будет неудобно реализовывать задуманное. Вместо рисунков на бумаге создают прототип, который может выглядеть как набор экранов или даже максимально походить на мобильное приложение, где кнопки нажимаются, а переходы переходятся.
Как создают прототип:
- Формулируют идею и требования к приложению.
- При помощи wireframe показывают, как пользователи будут взаимодействовать с интерфейсом. Wireframe — это скелет приложения. Он фокусируется на поведении пользователя и содержании будущего проекта.
Показывают то, что получилось, заказчику и конечным пользователям.
Обрабатывают комментарии, и улучшают прототип.
Этапы показа пользователям и улучшения часто повторяются.
Первое, для чего нужен прототип, — проверить работоспособность вашей идеи, насколько она нужна пользователям. СBInsight пишут, что стартапы чаще всего проваливаются, потому что в них нет потребности рынка. Прототип экономит часы разработчиков и дизайнеров: вы переделываете прототип, вместо того чтобы переделывать интерфейс самого продукта, что обойдется дороже.
Какие еще плюсы прототипа?
- отнести инвесторам, показать, как круто выйдет;
- найти прорехи в логике самой идеи;
- сразу можно будет что-то поменять и не тратить на это бюджет;
- показать потенциальным пользователям, чтобы понять, где улучшить;
- показать разработчикам, чтобы сразу было понятно, куда кодить и сколько примерно это будет стоить.
Есть классный пример того, как прототип помогает при создании продукта. В фильме The Founder Рэй Крок переосмысливает, как выглядит кухня фаст-фуда. Прежде чем делать Макдональдс каким мы его знаем и любим, владельцы чертят на теннисной площадке кухню и тестируют. Сначала получается так себе, но с третьей итерации они находят идеальное расположение зон на кухне. Если бы они сначала построили ресторан и вложили сотни тысяч в оборудование и проведение коммуникаций, это привело бы к большим убыткам.
После сборки в сервисе получается приложение разных степеней прожарки:
- Изображения, чтобы, например, добавить в презентацию.
- Прототип для тестирования на своем телефоне или для отправки ссылки тестировщикам. Он будет выглядеть как настоящее приложение или мобильный сайт, в зависимости от возможностей конкретного конструктора.
- Готовое приложение для AppStore или PlayMarket.
Поэтому если вы хотите обойтись совсем без кода, выбирайте сервисы, которые соберут приложение. Если умеете кодить или планируете работать в команде — делайте прототип, по которому разработчики смогут создать приложение. Для любой кастомной функциональности скорее всего понадобится верстальщик, дизайнер и разработчик.
Базовый же прототип или приложение можно сделать, опираясь на шаблоны. Например, журналист Арина Тарасова поделилась, как в команде проекта получилось сделать функциональное приложение для Зимнего Суриковского фестиваля искусств в Красноярске, используя сервис Glide:
«Задача была рассказать о фестивале и сделать проект максимально удобным. Мы отказались от идеи представлять проекты на конструкторах вроде Wix, Readymag, Tilda и прочих, потому что они открываются в браузере, что не всегда удобно. Еще QR-коды и аудио с Soundcloud выглядят не очень привлекательно, а мы создали много мультимедийных форматов для проекта.
К этому событию в городе запускают брендированный троллейбус, в котором висит QR-код на наше приложение. Приложение открывается, и люди включают аудиогид, который идет по маршруту этого троллейбуса, смотрят карту суриковских мест.
Нам не понадобилось никаких специальных знаний в разработке. В лайтовом режиме, где мы выполняли и другие рабочие задачи, на создание приложения ушло 2–3 дня, чтобы разобраться в интерфейсе и интегрировать туда все наши мультимедийные файлы. Так что без разработчика на этапе прототипа точно можно обойтись.
Из минусов: мы пользовались бесплатной версией, и там есть ограничения по сочетаниям цветов. Если шаблоны не совсем попадают в ваше видение, это неудобно, но все решается подпиской на сервис.
Внутри ресурса можно посмотреть статистику посещений. Так мы знаем, что люди пользуются приложением».
Далее мы рассмотрим ресурсы, в которых можно собрать прототип без знаний разработки.
Платформа для создания прототипов и прогрессивных web-приложений из Google Таблиц в качестве баз данных для приложений. В 2021 году Glide выпускают новую версию, где таблицы можно будет создавать и редактировать внутри их веб-версии.
Чтобы получилось приложение, структурируйте информацию в таблице, после чего Glide собирает новое приложение. Есть комьюнити, чтобы пообщаться, спросить совета или показать свое приложение.
Особенности:
- большая библиотека платных и бесплатных шаблонов;
- через веб-интерфейс настраиваются страницы и блоки приложений, а информацию можно редактировать в таблице;
- можно добавлять изображения и видео;
- встраивается чат, корзина и комментарии;
- подключается Google Analytics;
- приложение можно использовать по ссылке, ничего дополнительно устанавливать не нужно.
Сколько стоит: есть бесплатная версия, ограниченная по размеру таблицы и 100MB хранилища, с брендингом ресурса. Платные версии стартуют от $12 в месяц. Версия без брендинга с кастомным доменом от $32 в месяц.
Продвинутый drag-and-drop конструктор прототипов. Все делается в браузере и есть приложения, чтобы показать прототип пользователям.
Свой прототип можно показать людям на Proto.io Spaces.
Особенности:
- большая библиотека элементов;
- библиотека шаблонов, но можно собрать приложение из элементов;
- есть плагины для редакторов, чтобы добавить свой дизайн, сохранив все слои;
- удобное добавление ссылкой на тестинговый сервис, например, Usertesting;
- можно поделиться ссылкой на прототип — она откроется в мобильном браузере, встроить на свой сайт или предоставить доступ в мобильном приложении.
Сколько стоит: 15 дней пробный доступ ко всем функциям без привязки карты. От 24 долларов в месяц — можно одновременно делать 5 проектов. Есть скидки для студентов и общественных организаций.
Бесплатное десктопное приложение, делает полностью интерактивные прототипы для любой платформы. Результат можно увидеть на Android, iOS и в браузере.
Особенности:
- простые в использовании шаблоны;
- редактор надо качать, есть версия для MacOS и Windows и мобильное приложение;
- импорт из фотошопа и иллюстратора;
- экспорт в html и в нативное приложение *.apk для андроид устройств;
- можно добавить приложение на Usertesting, чтобы получить фидбек от реальных пользователей;
- есть совместное редактирование.
Сколько стоит: есть пробный период 15 дней со всеми функциями. Но бесплатно можно пользоваться инструментом для создания wireframe.от 19$ в месяц с неограниченным количеством прототипов.
Объединяет неограниченное количество пользователей для планирования, дизайна приложения и создания прототипа.
Особенности:
- включает все этапы: от прописывания логики до интерактивного прототипа;
- есть расширения для браузеров;
- библиотека шаблонов;
- около тысячи плагинов для подключения сторонних сервисов;
- совместная работа над прототипом: можно добавлять карточки в Трелло из страниц прототипа.
Превратит дизайн на Фигме в интерактивный прототип и даже нативное приложение без программирования. Есть приложение для тестирования.
Особенности:
- работает с Figma;
- подключает реальные данные;
- генерирует нативный код для Android и iOS.
Сколько: бесплатно неограниченное количество проектов, но можно поделиться проектом не более трех раз, на проекте будет лого ресурса. Платные подписки от €19 в месяц. Они позволяют делиться проектом без ограничений и включают техническую поддержку через электронную почту. В тарифе от €49 в месяц вы добавляете свой брендинг и получаете техподдержку вплоть до публикации приложения.
Собирает прототипы и полноценные мобильные приложения, используя данные из таблиц. Идеально подойдет, например, владельцам малого бизнеса, которые хотят сами сделать систему учета.
- обработка данных из разных таблиц и баз данных, главное, правильно организовать в них информацию;
- интеграция карт;
- в приложениях можно использовать NFC или QR-коды;
- есть шаблоны;
- для использования придется скачать приложение.
Сколько: Потестить и показать можно бесплатно, платные тарифы начинаются, если вам нужно подключить больше 10 человек — от $5/месяц.
Делает прототипы и вполне функциональные голосовые приложения для инструментов Alexa и действий Google. Есть группа на фейсбук, где можно похвастаться или спросить совета. Активно обновляются, прислушиваясь к идеям пользователей.
Особенности:
- прототип можно сделать в браузере или сразу загрузить на смартфон и протестировать;
- логика и структура создается перетаскиванием блоков;
- можно работать с командой;
- есть режим доски;
- режим тестирования на сайте.
Сколько: два проекта бесплатно для индивидуального использования. Oт 40$ в месяц, для каждого редактора нужен отдельный план
Подойдет для новичков. В веб-версии можно собрать постраничный интерактивный прототип приложения для всех устройств, включая умные часы. Чтобы посмотреть прототип, пользователю понадобится установить приложение.
При помощи своего отдельного продукта может превратить ваш прототип на бумаге в интерактивный прототип. Сфотографируйте свои наброски, свяжите объекты, которые должны быть интерактивными с другими объектами и экранами
Особенности:
- помимо приложений в конструкторе можно собирать прототипы сайтов;
- импорт макета из Sketch, или можно использовать готовый макет Sketch из библиотеки;
- добавление в прототип гифок, видео и карт;
- можно комментировать и делиться ссылкой на прототип.
Сколько: бесплатно для одного проекта, больше — от $12 в месяц.
В этом конструкторе больше всего функций для командной работы с дизайнером. У Invision есть плагин Craft, который превратит дизайн-макет в прототип прямо в Sketch. Показать прототип пользователю можно через приложение. Если возникли сложности, можно задать вопрос официальному аккаунту техподдержки в Twitter.
Особенности:
- режим доски;
- проектный менеджмент для дизайнеров;
- тестирование;
- умеет быстро подставлять шаблонную информацию, например, имена или фото с Unsplash;
- можно создавать ветки комментариев по конкретным разделам проекта;
- комментирование в режиме реального времени.
Сколько: бесплатно до 10 активных пользователей, больше — $7.95 за пользователя в месяц.
Подойдет владельцам макбуков, нужен аккаунт разработчика Apple. Показать прототип можно в Origami, мобильном приложении для iPhone или с макбука с установленным Origami. Есть активное комьюнити, где можно задать вопрос.
Особенности:
- мощные анимации;
- функции «экспорта кода», которые позволяют преобразовывать визуальный дизайн в письменный код;
- тестировать можно на мобильном устройстве, подключенном к ноутбуку;
- есть поддержка Figma и Sketch.
Cколько: бесплатно.
Все упомянутые сервисы обещают относительно низкий порог входа. Но в любом случае вам придется разбираться в редакторе и базовой терминологии. Для этого многие сервисы создают поддерживающие комьюнити. Например, Thunkable поддерживают возможность задать вопрос на сайте, Bravostudio предлагает поддержку через почту в платных версиях, а Voiceflow называют свое активное комьюнити с поддержкой своим главным преимуществом. Даже если вы пользуетесь бесплатной версией ресурса, обращайтесь за помощью на внутренних форумах, работа над похожими проектами может повысить шанс на ответ.
Еще есть вариант зарегистрироваться на обучающих сайтах. Например, No Code в платной подписке предлагают личные консультации и групповые сессии по созданию приложения. На Makerpad можно спросить на форуме и посмотреть дополнительные туториалы, а в платной подписке получать индивидуальную поддержку.
У меня есть решение, в котором есть 3 проекта. Один из них - консольное приложение, а другие 2 - это приложения для Windows. Оба приложения Windows используют консольное приложение, поэтому я добавил ссылку на консольное приложение в обоих проектах приложений Windows. Теперь, когда я создаю проекты окон, консольное приложение копируется в выходной каталог, но проблема в том, что его конфигурационный файл "consoleapp.exe.config" не копируется!
Если бы я использовал библиотеку (сборку) вместо консольного приложения, она создала файл конфигурации этой сборки в выходной папке.
Как решить эту проблему?
спросил(а) 2009-06-20T11:38:00+04:00 12 лет, 5 месяцев назадВыберите consoleapp.exe.config в дереве решений.
Выберите " Контент" для параметра Построить действие в сетке свойств.
Выберите Копировать всегда для параметра Копировать в каталог выпуска.
Надеюсь, это поможет вам:)
ответил(а) 2009-06-20T11:44:00+04:00 12 лет, 5 месяцев назадВаши приложения используют значения по умолчанию для ваших настроек из скомпилированного кода ссылочного проекта.
Вам нужно скопировать ваш app.config из других проектов (или, по крайней мере, скопировать параметры, которые вы хотите изменить) в вызывающий проект, а затем, когда компиляция приложения будет иметь [YourAppName].exe.config, который вы можете изменить.
ответил(а) 2009-12-19T01:05:00+03:00 11 лет, 11 месяцев назадБыстрое создание проекта консоли в VS2008 и добавление " App.config ", оно имеет настройки:
Действие сборки: нет
Скопировать в каталог Ouput: не копировать
Пользовательский инструмент: <blank>
Пользовательское пространство имен: <blank>
Однако я не уверен, какой эффект добавит ссылка на проект консоли, поскольку консольный проект представляет собой приложение, а не библиотеку классов.
Если вы хотите, чтобы консольное приложение запускалось с приложениями Windows для отладки, лучший подход, чем ссылки на проекты, должен был бы установить решение для запуска нескольких приложений. Щелкните правой кнопкой мыши по решению, выберите свойства и в меню "Пуск" node выберите несколько проектов. (И удалите ссылки на консольное приложение.)
Прежде чем постить в данной теме
РЕКОМЕНДУЕТСЯ ПРОЧИТАТЬ ПРАВИЛА РАЗДЕЛА "GAMEZ BAZAR" и Правила форума
Сама игра обсуждается здесь
- OS: Windows XP / Windows Vista
- Processor: Intel Core 2 Duo 1.86GHz or AMD Athlon 64 X2 4000+ or better
- RAM: 1GB RAM for XP, 2GB for Vista
- Video Card: 256MB 3D hardware accelerator card required - 100% DirectX 9.0c with Shader Model 3 support.
Видеокарты
-----------------------------------------
*Поддерживаемые видеокарты для Windows(R) XP и Window Vista(R)
Все NVIDIA(R) GeForce(TM) 7800 GT 256 MB и более новые модели.
Все ATI Radeon(TM) X1800 256 MB и более новые модели.
Q: Проблемы со звуком - не слышно голосов в игре. Звук шипит и.т.п.
A: Панель управления, Звуки и аудиоустройства, Вкладка Аудио, Настройка, "Качество записи", передвинуть ползунок "Аппаратное ускорение" (верхний) в крайнее левое положение.
A: Переместите/удалите из папки игры файл 00audio.rcf
Минус: После это-го пропадает звук города, сигнали машин, музыка при тревоги, звук когда персонаж летит и т.д
A: Зайти в папку *путь к игре*\Prototype\audio, найти ambience.p3d и удалить, тогда основные звуки должны остаться
Q: Выкидывает с такой ошибкой "память не может быть read"
A: Подробная инструкция здесь
Q: Какой SP нужен?
A: XP sp2-sp3, Vista sp1
Q: Сколько весит полная версия игры?
A: 7,4гб
Q У меня тормозит игра, что делать?
A Поставте настройки видео драйверов на DEFAULT
Q: У меня постоянно виснет и вылетает игра на Windows Vista (пиратская версия игры)
A: Смените кряк
Q: Не могу поставить разрешение более 1024 х 768
A: Проблема в обьеме памяти видеокарты.
для видеокарт с 256мб видеопамяти
Разрешения: 640 x 480 ; 800 x 480 ; 800 x 600 ; 1024 x 768 ; 1152 x 720 ; 1152 x 864 ; 1280 x 720 ; 1280 x 800
Q: Как передвигаться по стенам?
A: Два варианта. Первое просто бег в режиме спринта – Алекс забежит на любую стену. Второе подойти к стене и нажать «е», Алекс прицепится к стене как Человек паук и можно будет спокойно лезть.
Q: Что такое умение «глайд» (glide) как им пользоваться?
A: Умение позволяет парить в воздухе. Прыгаем в режиме спринта и, не отпуская кнопки движения, в воздухе еще раз жмем прыжок.
Q: Как пользоваться скрытным поглощением?
A: Подойти к цели со спины нажать «f» и нажать «e» когда значок и буква е загорятся красным (небоходимо чтобы рядом не было смотрящих прямо на вас врагов). Возможность появляется автоматически по ходу игры – покупки не требует.
Q: Как пользоваться артиллерийским ударом?
A: По ходу сюжета вы поглотите командира спецназа, что даст вам возможность наносить артиллерийские удары. В личине военного (любого) поймать любой объект в прицел «tab», нажимаете «f» и жмете правую кнопку мыши. Чтобы возобновить арт. удар надо снова поглотить командира.
Q: Случайно убил (на глазах убили) сюжетного человека (для поглощения памяти) – что делать?
A: Не волноваться, позже он появится снова.
Q: Не могу зайти на военную базу.
A: Надо поглотить командира базы, он всегда находится во дворе базы – единственный солдат в кепке и солнечных очках, с желтой повязкой.
Q: Не могу прокачать оружейные навыки и навыки использования техники.
A: Надо поглощать определенных солдат, выделенных специальными значками. Найти их можно на военных базах, рядом с которыми на карте есть маленький плюс. Также на базах бывают сюжетные персонажи.
Q: Как уничтожить военную базу (улей мутантов)?
A: Выделять целью и стрелять или бросать крупные предметы.
Q: Как взламывать стационарные детекторы?
A: Подойти, нажать правую кнопку мыши после появления надписи вверху экрана, последовательно нажимать клавиши соответствующие появляющимся цифрам от 1 до 4.
Q: Как угонять вертолет?
A: Взять в прицел, подпрыгнуть к нему и нажать «е». Если прокачан навык «Longshot grab» (хлыст), то включить хлыст поймать вертолет в прицел, подойти (подпрыгнуть) поближе – но не обязательно в упор и нажать «е».
Q: В миссии задача которой уничтожить стационарные детекторы (всего детекторов 3), но их не берёт не выстрелы из вертолёта, не авиа удар, и руки. Что делать?
A: Вас попросят подлететь (на вертолете) к трем стационарным детекторам, сначала клавишей "TAB" выделите 1 из маяков, затем (не отпуская "TAB") быстро переведите курсор (прицел) на другой детектор. (если не получилось и вас опять просят выделить в таргет (прицел) один из маяков, то повторите все что было написано выше, но когда будете водить прицелом начните стрелять.
Как бы доработать пример так, что сначала вызывается программа с параметрами "openssl.exe -a -b -c . ", далее она ожидает ввода с клавиатуры (если бы её запускать с cmd), нужно её подсунуть содержимое на сотню другую байт (контент), который она зашифрует и выдаст ответ, который и надо считать.
Вот считывание в примере и реализовано, но как бы сделать запись в консоль?
← →
брат Птибурдукова ( 2013-01-14 19:40 ) [1]
Создавай два пайпа. Второй запуздыривай сюда: hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем
← →
Игорь Шевченко © ( 2013-01-14 19:52 ) [3]
if not WasOK then
raise Exception.Create( "Ошибка выполнения или компиляции: " +
Chr( 10 ) + Chr( 13 ) + CommandLine )
Для интернетов самое то
← →
Игорь Шевченко © ( 2013-01-14 20:01 ) [4]
Ничего не получалось. Это приводило к тому, что консоль отображалась на экране, программа ничего не считывала (после данного кода шло считывание ReadFile).
Возник другой вопрос, почему я запускаю команду "ftp":
дальше стандартный код, подходим к считыванию данных из консоли:
>WasOK := ReadFile( StdOutPipeRead, Buffer, 255, BytesRead, nil );
на этом месте исполнение зависает навсегда. Хотя если в консоле набрать ftp, то мы видим приглашение:
Почему это приглашение "ftp>" не считывается?
Хотя писать можно, да.
Камрады, измучился весь с этим Openssl.exe
Есть такая команда:
> openssl.exe smime -sign -signer public.pem -inkey private.pem -nochain -nocerts -outform PEM -nodetach
Я пробовал после WriteFile делать:
Но ответом идет False с кодом GetLastError = 87, что означает:
"Параметр задан неверно".
После WriteFile делать CloseHandle(StdinPipeWrite) тоже пробовал.
Что делать? Как запустить openssl и передать в него текст, сообщив о конце передачи текста?! (
← →
Игорь Шевченко © ( 2013-01-18 20:39 ) [8]
от безысходности писал также:
тоже не получилось.
← →
брат Птибурдукова ( 2013-01-19 00:43 ) [11]
Попробуй в командной строке выполнить openssl.exe smime -sign -signer public.pem -inkey private.pem -nochain -nocerts -outform PEM -nodetach
> Попробуй в командной строке выполнить openssl.exe smime
> -sign -signer public.pem -inkey private.pem -nochain -nocerts
> -outform PEM -nodetach -in InFile.content
← →
брат Птибурдукова ( 2013-01-19 13:21 ) [13]
> Только в openssl это указывается доп. командой
Так ты уверен, что с перенаправлением вывода всё работает так же корректно, как с дополнительным параметром?
> Так ты уверен, что с перенаправлением вывода всё работает
> так же корректно, как с дополнительным параметром?
да, попробовал сейчас команду:
> openssl.exe smime -sign -signer public.pem -inkey private.pem -nochain -nocerts -outform PEM -nodetach
отработало просто на ура, тут же выдало ответ и вышло из программы openssl.
Причем, для openssl вроде как есть оттестированный рабочий код для PHP, его структура вроде бы понятна и на дельфи нечто такое же получается:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w")); // stderr is a file to write to
$process = proc_open(
"openssl smime -sign -signer " . $certificate .
" -inkey " . $privkey .
" -nochain -nocerts -outform PEM -nodetach",
$descriptorspec, $pipes);
if (is_resource($process)) <
// $pipes now looks like this:
// 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout
fwrite($pipes[0], $source);
fclose($pipes[0]);
но тем не менее на дельфи изобразить не получается ((
← →
Игорь Шевченко © ( 2013-01-21 00:21 ) [16]
уже код пора выкладывать
try
// Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
// а так же проверяем, чтобы он не показывался на экране.
with SI do
Begin
FillChar( SI, SizeOf( SI ), 0 );
cb := SizeOf( SI );
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE or SW_SHOWMINNOACTIVE;
hStdInput := StdInPipeRead; //GetStdHandle(STD_INPUT_HANDLE);
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
CommandLine := """ + FAppPath + "" " + FParam ;
sCurDir := ExtractFileDir(FAppPath);
WasOK := CreateProcess( nil,
PChar( CommandLine ),
nil,
nil,
True,
0,
nil,
PChar(sCurDir),
SI,
PI );
FhProcess := PI.hProcess ;
if Line <> "" then
OemToChar(PChar(Line), PChar(FAllRead)) ;>
SetEvent(FeventFinishRead) ;
// ждём, пока завершится консольное приложение
hArray[0] := pi.hProcess;
hArray[1] := FeventTerminate ;
WaitRes := WaitForMultipleObjects(2, @hArray, false, INFINITE);
if WaitRes = WAIT_OBJECT_0 then // значит, терминировался именно процесс запущенный
FStatus := prsEnd ;
FExitCode := 0;
GetExitCodeProcess( pi.hProcess, FExitCode );
finally
// Закрываем все оставшиеся дескрипторы
CloseHandle( PI.hThread );
CloseHandle( pi.hProcess );
end;
end;
finally
SetEvent(FeventFinishRead) ;
CloseHandle( StdOutPipeRead );
if StdInPipeWrite <> 0 then
CloseHandle( StdInPipeWrite );
if StdInPipeRead <> 0 then
CloseHandle(StdInPipeRead);
end;
end;
> WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil );
← →
Игорь Шевченко © ( 2013-01-21 15:34 ) [18]
WaitForInputIdle вставить не поможет перед началом работы с вводом-выводом?
> WaitForInputIdle вставить не поможет перед началом работы
> с вводом-выводом?
вставил перед WriteFile.
WaitForInputIdle(pi.hProcess, INFINITE) возвращает 0xFFFFFFFF.
GetLastError = 18: "Больше файлов не осталось"
Результата не дало.
← →
Игорь Шевченко © ( 2013-01-22 14:41 ) [21]
> // если процесс может быть создан, то дескриптор, это его
> вывод
> CloseHandle( StdOutPipeWrite );
Зачем этот вызов ?
← →
Игорь Шевченко © ( 2013-01-22 14:57 ) [22]
надо закрыть описатели записи в stdout и чтения stdin
Для того чтобы создать консольное приложение, надо в меню File выбрать команду New Project , в появившемся окне New Project выбрать CLR Console Application , в поле Name ввести имя проекта (рис. 6.2) и нажать кнопку OK . В результате этих действий станет доступным окно редактора кода, в котором можно набирать текст программы.
Рис. 6.2. Начало работы над консольным приложением
В качестве примера в листинге 6.2 приведен текст консольного приложения — утилиты clear, которая удаляет из каталога, указанного при запуске утилиты, и всех его подкаталогов tmp-файлы. Также, если при запуске утилиты указан ключ –CLEARDEBUG , утилита удаляет все файлы из всех подкаталогов Debug. Так как операция удаления является потенциально опасной, то утилита запрашивает у пользователя подтверждение на выполнение. Причем, чтобы операция очистки была начата, необходимо ввести Y , ввод любого другого символа, в том числе y , отменяет операцию. Основную работу — удаление файлов выполняет рекурсивная функция сlear. Сначала она обрабатывает (удаляет tmp-файлы) текущий каталог, затем формирует список подкаталогов
Часть II. Практикум программирования
текущего каталога, делает текущим первый (по номеру элементов списка) подкаталог и вызывает себя (рекурсия) для обработки этого подкаталога.
Листинг 6.2. Очистка диска (консольное приложение)
// clear.cpp : main project file.
using namespace System;
using namespace System::IO;
кол-во удаленных файлов
bool debug = true ;
bool clearDebug = false ; //
очистка каталогов Debug
// Очистка текущего каталога и всех его подкаталогов.
// подкаталоги текущего каталога
// файлы, которые надо удалить
int p = System::IO::Directory::GetCurrentDirectory()->
// удалить все файлы из каталога Debug
Files = Directory::GetFiles (System::IO::Directory::GetCurrentDirectory(),"*.*");
Глава 6. Консольное приложение
Files = Directory::GetFiles (System::IO::Directory::GetCurrentDirectory(),"*.tmp");
// удалить tmp-файлы из текущего каталога
Files = Directory::GetFiles (System::IO::Directory::GetCurrentDirectory(),"*.tmp");
int nf = Files->Length; for (i = 0; i if (! debug)
Console::WriteLine(Files[i] + " — удален"); nDel = nDel +1;
// обработать подкаталоги if (debug)
n = Directories->Length; for (i = 0; i if (debug) Console::WriteLine(Directories[i]);
Часть II. Практикум программирования
int main( array ^args)
char r; // ответ пользователя: Y или N
// проверим, указано ли имя файла теста if (args->Length == 0)
Console::WriteLine("Ошибка: Надо задать каталог."); Console::WriteLine("Команда: clear [-CLEARDEBUG]"); Console::WriteLine("-CLEARDEBUG — очистка каталогов Debug
");
Console::ReadLine(); return -1;
// проверим, существует ли указанный каталог try
catch (System::IO::DirectoryNotFoundException^ ex)
Console::WriteLine("Каталог " + path +" не найден");
Console::ReadLine(); return -1;
("Программа удалит все файлы из подкаталогов Debug");
Глава 6. Консольное приложение
Console::WriteLine("каталога "+ path+ " и всех его подкаталогов.");
Console::WriteLine("Программа удалит tmp-файлы");
Console::WriteLine("из каталога "+ path+
" и всех его подкаталогов.");
Console::ReadLine(); return -1;
Console::WriteLine("Удалено файлов: "+ nDel.ToString()); Console::WriteLine("Работа выполнена!"); Console::Write("Нажмите ");
Console::ReadLine(); return 0;
Построение консольного приложения выполняется обычным образом, т. е. выбором в меню Build команды Build Solution .
После успешной компиляции программу можно запустить. Для этого надо в меню Debug выбрать команду Start Debugging или Start Without Debugging .
Если программа должна получать параметры из командной строки, то при ее запуске из среды разработки параметры надо ввести в поле Command Arguments раздела Configuration Properties Debugging окна Property Page
(рис. 6.3), которое становится доступным в результате выбора в меню Project команды Properties . Следует обратить внимание: если в строке-параметре есть пробелы, то ее надо заключить в двойные кавычки.
У меня есть решение, которое имеет 3 проектов. Одним из них является консольным приложением и другие 2 являются окно приложения. Оба окна приложение использует консольное приложение, поэтому я добавил ссылку на консольном приложении в обеих окнах приложений проектов. Теперь, когда я строю окна проектов, консольное приложение копируется в выходной каталог, но проблема в том, что его конфигурационный файл «consoleapp.exe.config» не копируется!
Если бы я использовал библиотеку (сборки) вместо консольного приложения, он будет создан конфигурационный файл этой сборки в папке вывода.
Как решить эту проблему?
Выберите consoleapp.exe.config в дереве решений.
Выберите « Содержимое » для сборки Действие опции в собственности сетки.
Выберите Копировать всегда для копирования в каталог вывода опции.
Надеюсь, что это помогает 🙂
Быстрое создание консольного проекта в VS2008 и добавив « App.config », он имеет параметры:
Строить Действие: Нет
Скопировать в каталог Ouput: Не копировать
пользовательский инструмент:
Пользовательский инструмент Пространство имен:
Однако я не уверен, что эффект добавление ссылки на проект консоли будет иметь, как проект консоли представляет собой приложение, а не библиотеки классов.
Если вы хотите, чтобы консольное приложение для запуска с приложениями Windows, для отладки, то лучше, чем подход ссылок проекта будет установить решение для запуска нескольких приложений. Щелкните правой кнопкой мыши на решения, выберите свойства и на узле Start Project, выберите несколько проектов. (И удалить ссылки на консольное приложение.)
Ваши приложения используют значение по умолчанию для параметров из скомпилированного кода ссылочного проекта.
Плюс еще создается какой то Ref директорий
Seriously?
Можно ли как то собрать просто один exe? В настройках проекта ничего не нашел.
Или задать эти свойства во время публикации: dotnet publish --self-contained /p:SelfContained=true ..
Ок, я взял эти настройки. Скомпилировал. Теперь в релиз директории лежат 226 файлов (большинство из них это "api-ms-win-*" и "System.*" dlls).
Среди этой кучи файлов нахожу свой ConsoleApp1.exe, копирую его пару директорий выше и запускаю.
Что то еще не хватает?
Здравствуйте, HotDog, Вы писали:
HD>Ок, я взял эти настройки. Скомпилировал. Теперь в релиз директории лежат 226 файлов (большинство из них это "api-ms-win-*" и "System.*" dlls).
HD>Среди этой кучи файлов нахожу свой ConsoleApp1.exe, копирую его пару директорий выше и запускаю.
HD>
HD>Что то еще не хватает?
Здравствуйте, HotDog, Вы писали:
HD>Что то еще не хватает?
Ну вот содержание такого профиля, всё настраивается в настройках публикации:
Конкретную платформу (RuntimeIdentifier) выбрать всё же придётся, без неё единого исполняемого файла не получить. Файл получится небольшого размера.
Здравствуйте, Vladek, Вы писали:
V>Конкретную платформу (RuntimeIdentifier) выбрать всё же придётся, без неё единого исполняемого файла не получить. Файл получится небольшого размера.
Но на х86 этот файл не запустится. Так?
Здравствуйте, HotDog, Вы писали:
Просто выбери не "автономный" режим, а "зависит от платформы" (SelfContained=false)
Здравствуйте, gandjustas, Вы писали:
HD>>Что то еще не хватает?
Вот тут ты не прав. Для FW 4.x можно указать "Any CPU" и приложение будет работать как в 32 битном, так и 64-x битном режиме.
Здравствуйте, _NN_, Вы писали:
_NN>Далее, нет штатной возможности создать один файл.
_NN>Всегда будет exe + dll.
_NN>Сам файл exe это заглушка для запуска на конкретной платформе.
Но ведь это так то странно все. В настройках проекта я могу поставить "Platform target: Any CPU".
Если я возьму те самые файлы что я указал в самом первом посте, то они работают и на x86 и на x64 нативно (я имею ввиду 32/64 бита).
Но вот publish "убирает" зависимость от json, мержит dll+exe и ломает независисость от платформы.
Здравствуйте, HotDog, Вы писали:
HD>Здравствуйте, _NN_, Вы писали:
_NN>>Далее, нет штатной возможности создать один файл.
_NN>>Всегда будет exe + dll.
_NN>>Сам файл exe это заглушка для запуска на конкретной платформе.
HD>Но ведь это так то странно все. В настройках проекта я могу поставить "Platform target: Any CPU".
HD>Если я возьму те самые файлы что я указал в самом первом посте, то они работают и на x86 и на x64 нативно (я имею ввиду 32/64 бита).
HD>Но вот publish "убирает" зависимость от json, мержит dll+exe и ломает независисость от платформы.
Ссылку смотрели ?
Dll это и есть платформонезависимый код.
Тот файл который был у вас изначально, после компиляции, не публикации.
Это файл можно взять хоть на Линукс и запустить через dotnet My.dll
RuntimeIdentifier=win-x86 ибо заработает на всех системах
Бинарник 103КБ получается
Здравствуйте, _NN_, Вы писали:
_NN>Ссылку смотрели ?
_NN>Dll это и есть платформонезависимый код.
_NN>Тот файл который был у вас изначально, после компиляции, не публикации.
_NN>Это файл можно взять хоть на Линукс и запустить через dotnet My.dll
Ещё раз:
NET FW может делать универсальные AnyCPU-екзешники, которые работают как 32-битные в 32-битной среде и как 64-битные в 64-битной среде.
Возможно, тебя путает включенная по умолчанию настройка-галочка "prefer 32-bit", которая заставляет AnyCPU-екзешники запускаться в 64-битной среде в 32-битном режиме. Иногда они так работают быстрее. Но если в какой-нибудь серверной ОС 32-битный режим отсутствует полностью, программа запустится как 64-битная.
Здравствуйте, HotDog, Вы писали:
HD>Здравствуйте, Vladek, Вы писали:
V>>Конкретную платформу (RuntimeIdentifier) выбрать всё же придётся, без неё единого исполняемого файла не получить. Файл получится небольшого размера.
HD>Но на х86 этот файл не запустится. Так?
Не проверял, но думаю — не запустится.
Если для серверного приложения это еще как-то подходит, то для настольного приложения это выглядит дико, конечно.
в смысле размера и реализации. Ведь тут по сути самораспаковывающийся архив. Даже знаю были проблемы в ранних версиях со стратовым каталогом(определялся как недра temp — куда шла распаковка).
вообщем странное решение. триминг тоже так себе. вероятно максимум это незагруженные библиотеки отделит.
Да и скорость запуска консольного приложения на моей машине. релизная сборка без упаковки (dll) запускается real
100. В то время как rust и dmd(dlang со сборщиком мусора) оба real
1.
Как ни крути dotnet это почти точная, чуть улучшеная в плане работы с памятью java.
100. В то время как rust и dmd(dlang со сборщиком мусора) оба real
1.
vaa>Как ни крути dotnet это почти точная, чуть улучшеная в плане работы с памятью java.
Здравствуйте, vaa, Вы писали:
vaa> Ведь тут по сути самораспаковывающийся архив. Даже знаю были проблемы в ранних версиях со стратовым каталогом(определялся как недра temp — куда шла распаковка).
vaa>Читал, только тут не понятно, это действительно одна сборка или просто архив со сборками, которые тупо загрузять в память и дальше будет использован стандартный механизм загрузки сборок из массива.
Есть же вроде опиция Trim, при применении которой особой разницы не будет.
Читайте также: