Страницы

Поиск по вопросам

Показаны сообщения с ярлыком c#. Показать все сообщения
Показаны сообщения с ярлыком c#. Показать все сообщения

среда, 15 апреля 2020 г.

Какие проекты можно создать на monotouch?

#mono #monotouch #monodroid #c_sharp

                    
Доброго времени суток. Хотелось бы узнать возможно ли с помощью mono создать полноценные
игры, приложения для мобильных устройств? Или это лишь затравка для создание просты
приложений? Возможно ли с помощью mono делать полноценные игры с физикой и анимацией?
Если да, то как это делается.. Например openGl, что то похожее на XNA? Если можно со
ссылками.    


Ответы

Ответ 1



Есть MonoGame(Бывший XnaTouch), есть аналогичный ExEn, тоже еще одна реализация Xna под MonoTouch. А самое интересное, скоро должен выйти DeltaEngine, очень крутой движок покрывающий практически все платформы.

Выбор книги по C# [закрыт]

#c_sharp #книги

                            
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
            
                    
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 4 года назад.
                    
                
        

Недавно появились на полках магазинах новые издания книг по C#. Хотелось обсудить
какая книга лучше всего подходит для человека, который не имел дело с программирование
и хочет начать с свое знакомство с C#. Думаю смысл обсуждения есть потому, что люди
которые хотят заниматься C# и не имею опыта в программирование имеет смысл начинать
изучение с 2010 студии и 4 версии платформы .NET. Вот какие бы книги я бы хотел обсудить

Грин Д., Стиллмен Э. Изучаем C#. 2-е изд. Серия: Head First O'Reilly
Карли Уотсон, Кристиан Нейгел, Якоб Хаммер Педерсен, Джон Д. Рид, Морган Скиннер Visual
C# 2010. Полный курс
C# 4.0: полное руководство. Герберт Шилдт 

Я отдаю предпочтения первым двум книгам потому, что после каждой главы в них имеются
упражнения. Хочу услышать ваши мнения на счет данных книг.    


Ответы

Ответ 1



На stackoverflow.com отчаянно советуют Head First C#.

Ответ 2



Читал 1 и не до конца 3. По формату изложения, больше нравится 1. Мне кажется книга подойдёт не только новичкам, но и людям которые уже разбираются в языке и которые хотят структурировать все знания в голове.

Ответ 3



C# 4.0: полное руководство. Герберт Шилдт По мне так книга в самый раз для новичков, интересное описание, постоянные упражнения. Книга большая, но там можно найти всё что душе угодно, советую! ))))

Ответ 4



Первая книга из списка и есть Head First C# в переводе для себя выбрал сочетание - первой, на английском, и третьей на русском. хед фирст дает упражнения, а у шилдта все структурировано и если что то не понял в первой книге то по шилдту уточняешь

Как сделать дополнительные кнопки на окне?

#c_sharp #winforms

                    
Как сделать дополнительные кнопки на окне, помимо 3 основных (свернуть, развернуть,
закрыть) на C#?    


Ответы

Ответ 1



Для начала, судя по всему, без использования Win32 не обойтись. (Или третьесторонней библиотеки, к-ая за вас использует Win32). Вот здесь я нашел более менее ответ. Пример оттуда же. (попробовал, правда работает) Далее перевожу вариант, совместимый с Аэро (как наиболее актуальный): Это решение основано на Win32-примере по этой ссылке: http://msdn.microsoft.com/en-us/library/bb688195(VS.85).aspx В принципе, нужно сделать следующее: Расширить клиентскую область окна так, чтобы она покрывала весь Frame. Для этого нужно перехватить WM_NCCALCSIZE-сообщение и вернуть 0. Так не-клиентская область станет нулевого размера, что значит, что клиентская будет покрывать все окно. Расширить Frame до размеров клиентской области, используя DwmExtendFrameIntoClientArea. Это скажет ОС рисовать Frame над клиентской областью. Вышеописанные шаги дают вам окна со стандартным стеклянным оформлением, исключая иконку окна и заголовок. Кнопки свернуть, развернуть и закрыть будут продолжать рисоваться и работать. Что не будет работать, так это перетаскивание и изменение размеров окна, потому что фрейма теперь нет, а клиентская область покрывает все окно. Теперь можно рисовать на окне как обычно. Можно даже поместить контролы в заголовок. Осталось только перехватывать WM_NCHITTEST-сообщения, брать из них информацию о положении курсора мыши и возвращать информацию о том, в какой части окна он находится. Например, если вернуть HT_CAPTION, то окно будет работать так, как будто курсор находится на заголовке, и будет позволять перетаскивать окно и т.д. С этой функцией получится сделать полнофункциональное окно с кастомным фреймом.

Как передать звук с микрофона по сети?

#c_sharp #c #delphi #cpp

                    
Нужно передать звук с микрофона по сети на другой комп и воспроизвести там. Я знаю,
что мне нужна 2 программы. Сервер и Клиент. А еще я знаю, что я дожна использовать
RTP. Я справилась с задачей c помощью FTP.  Думала, что и с этой справлюсь, но что-то
не получается. Прошу помощь. Спасибо всем заранее.    


Ответы

Ответ 1



По хорошему суть такова: берем поток с микрофона, режем на кусочки по 0.1-0.5 сек (смотря насколько вам нужен реалтайм, чем выше частота, тем больше нагрузка). Кодируем сей кусочек в mp3 и шлем по уже созданному сокет-соединению. Там, соотв-но, дешифруем и воспроизводим. Собственно, если вас не сильно заботит траффик, можно решать в лоб(без перекодировки, в PCM MONO). В который раз тут пиарю либу, уж простите) Чего делаем: инициализируемся, определяем девайс микрофона. Выставляем потоку глубину/частоту, чтобы ваше соединение вытянуло (ширина потока будет = (глубинаbps / 8) * 1 канал(моно) * частотадискретизации байт/сек). Далее: открываем соединение с клиентом и раз в 0.1-0.5 сек берем с потока байты и шлем в сокет. С такой же частотой на клиенте считываем данные с сервера и напрямую воспроизводим. Отправку/прием лучше реализовать в отдельном потоке. В архиве для дельфей (скорее всего не только, но не проверял) куча примеров, которые можно расковырять. В т.ч. был пример с инет-радио. В том же архиве хелп по всем функциям, наложить их на алгоритм выше не должно быть проблемой.

Наследование xml комментариев в c#

#c_sharp

                    
Есть ли в c# возможность наследовать xml комментарии? Например, если я определил
поле/метод в базовом классе и использую в потомке, его смысл не меняется - однако приходится
вводить заново комментарий - иначе он не будет виден в IntelliSense.    


Ответы

Ответ 1



В случае интерфейсов Visual Studio 2010 показывает xml-комментарий из него, если у реализаций интерфейса этот комментарий отсутствует. Предполагаю, что тоже самое должно происходить и в случае некоторого базового класса. А вообще, для автоматизации копирования xml-комментариев и прочих вещей хорошо подходит Ghostdoc.

Процент покрытия кода юнит-тестами

#c_sharp #net #тестирование #юнит_тесты

                    
Есть ли какой нибудь способ точно оценить процент кода, покрытого юнит-тестами (nunit)?    


Ответы

Ответ 1



Для тестов в Visual Studio есть встроенные средства, позволяющие считать покрытие. Нужно Включить расчет покрытия: Test > Edit Test Run Configurations > Your Test Configuration, далее Code Coverage, и выбрать сборку для тестирования. Прогнать тесты. Правый клик по тестам, и вызов Code Coverage Results. В итоге вы увидите статистику по процентам Not Covered Blocks Not Covered Blocks % Covered Blocks Covered Blocks % Не проверял, как это соотносится с nUnit. Еще есть сторонние стредства, например, nCover, partCover, openCover.

Список алгоритмов на C#

#c_sharp #алгоритм

                    
Недавно набрел на сайт "Список алгоритмов и структур данных на Java" например вот
описан алгоритм имитации отжига . В общем показалось это очень удобно, может кто видел
такое же для C#? Сложно ли будет на крайний случай сконвертировать?    


Ответы

Ответ 1



Для таких задач - абсолютно не сложно. JLCA 80% работы сделает, визуализационную часть придётся ручками доработать. Как пример - Mp3Sharp, декодер mp3, он конвертирован из явы.

понедельник, 13 апреля 2020 г.

SilverLight XAML. Binding цвета эллипса к элементу массива цветов

#c_sharp #silverlight #xaml

                    
У меня есть эллипс, и вот такая конструкция:
private Brush lampColor;
public Brush LampColorTest
{
    get { return lampColor; }
    set
    {
        lampColor = value;
        OnPropertyChange("LampColorTest");
    }
}

С помощью какой-то команды я задаю LampColorTest значение, допустим, Yellow. Когда
это происходит, эллипс перекрашивается в желтый цвет. Привязываю эллипс я так:


Ответы

Ответ 1



Написать свой IValueConverter? public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { int index; if (!Int32.TryParse(parameter.ToString(), out index)) { // грязно ругаемся } var list = value as IList; if (list == null || list.Count < index + 1) { // аналогично } return list[index]; }

Exception handling

#c_sharp #sql_server

                    
Есть программа для работы с базой данных на локальном компьютере. Есть проект Data
access layer`а и клиентского приложения. В данном клиентском приложении я ловлю исключения
прямо в обработчику нажатия кнопки, при вызове методов из DAL. Правильно ли так делать?
Если нет, то как и где  правильно это делать? Какие есть правило хорошего тона ловли
исключений?  Покидайте хорошие статьи если есть таковы. Заранее благодарен за помощь.
UPD------
Кстати,  в MVC исключения, связанные с некорректными входящими данными, допустим,
на текстбокс, правильно ловить во View?    


Ответы

Ответ 1



Общие советы: Вынесите логику (в том числе обработку исключений) из обработчиков событий в отдельные методы, в обработчике оставьте только вызов метода (Разделение UI и логики, повторное использование кода). Не перехватывайте все исключения. Обычно всё, что мы можем сделать с неизвестным исключением - записать его в лог. Поэтому вместо перехвата исключений в каждом методе, лучше сделать общий обработчик, например, так Application.ThreadException - событие (для WinForms) Обработайте ожидаемые исключения. Например, при соединении с базой вполне возможно, что SQL Server недоступен. Отличная статья на CodeProject по обработке исключений (на английском).

Ответ 2



Ловить обрабатывать исключения нужно на том же уровне абстракции, где оно происходит. С другой стороны, если нужно пробросить исключение выше, то ему нужно изменить уровень абстракции и сделать более общим, а потом сделать исходное как inner. В вашем случае получается что уровень представления работает с исключениями с уровня данных. Например, подход MVC для этого делает контроллеры, которые отвечают за правильное обеспечение данных представлению. В свою очередь, у моделей делают специальные сервисы, а это сервисы уже взаимодействуют с хранилищем. Так вот доступ к хранилищу происходит через общий интерфейс, который декларирует какие исключения могут происходить. Как только они происходят, контроллер ловит их и упаковывает в исключения на своем уровне абстракции. По поводу статей не подскажу, но вообще это изучается в курсах Software Design, handling exceptions. Знаю что это действительно важный вопрос и его стоит задавать на раннем этапе проектирования.

Запросы к базе данных MSSQL в высоконагруженном приложении

#c_sharp #sql_server

                    
Хочу создать static class для работы с БД, содержащий методы для получения данных.
Но дело в том, что обращения к методам класса могут происходить из разных потоков.
Вопрос. Как поведет себя подобный класс при одновременном обращении к одному из методов
из двух разных потоков? (Будет ли он ждать, пока завершится первый запрос, произойдет
исключение или запрос будет выполнятся в другом потоке?)
Точнее: Как правильно организовать запросы к БД осуществляя их из разных потоков?    


Ответы

Ответ 1



Заложить в подобной задаче статический класс, как фундамент работы с БД, означает отказаться от ООП и перейти к процедурному программированию, постепенно наращивая "мусорник", в лучшем случае разделенный на "хелпер" классы, "датасорсы" или еще чего. Более того, "контекст" БД обычно НЕ потокобезопасный, как и статика, и вам придется постоянно заботиться о синхронизации. Гораздо эффективней применить какую-либо ORM для работы с БД + (UnitOfWork + Repository + Specification). В данном подходе архитектура станет к тому же и тестируемой, чего не скажешь про сплошные статические классы и методы, протестировать которые можно только при помощи дополнительного кода в виде "врапперов". Для управления жизненным циклом объектов имеет смысл использовать один из существующих решений DI/IoC. Например в вашем случае можно на этапе настройки указать жизненный цикл для контекста БД "PerThread" и "контейнер" будет сам следить, чтобы в каждом потоке был свой, новый контекст или одна транзакция.

Зачем в пользовательском контроле поле components?

#c_sharp #visual_studio #usercontrol

                    
При создании нового контрола студия всегда создаёт поле
private System.ComponentModel.IContainer components = null;

но никогда его не использует.
Для чего оно нужно?    


Ответы

Ответ 1



На форму можно положить не только контролы, но и невизуальные компоненты. В то время как контролы при закрытии формы освобождаются автоматически, т.к. форма знает о своих дочерних контролах и прибивает их, компоненты этим свойством не обладают, и их надо закрывать явно. Для этого дизайнер создаёт переменную components и в перекрытом методе Dispose() прибивает компоненты, которые положены на форму. Для того чтобы понять, чем недоволен компилятор, посмотрите на две вещи: 1. Есть ли на форме невизуальные компоненты? 2. Если есть, есть ли среди них компонент, конструктор которого принимает экземпляр IContainer. Правильно написанные компоненты должны иметь именно такой конструктор, который будет генерироваться дизайнером.

Ответ 2



Мой ответ может быть не очень точным. На самом то деле используется, там хранятся ссылки на компоненты (потому что форма это контейнер) и при закрытии формы идет освобождение ресурсов (компонентов). Там в комментариях еще же написано: Required designer variable.

Правила и фильтры OpenLayers (отбор по свойствам объектов)

#c_sharp #json #javascript #openlayers #geojson

                    
Есть GeoJSON вида:

{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-108.04,44.68]},"properties":{"course":184.7,"vid":1}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":44.1,"vid":2}}]}


Являющийся источником слоя vectors (см. "Как послать JSON в теле HTTP-ответа?").
Нужен фильтр показывающий только точки с vid входящим массив, вида:  

var pointShow = [1,3];


Вроде бы для этого нужно использовать правила (Rule), но я с OpenLayers не особо
знаком, да и в интернете найти что-то по теме кроме описания FeatureId на сайте "OpenLayers"
не получилось.  

Пробовал сделать так:

var myStyle = new OpenLayers.Style();
var defRule = new OpenLayers.Rule({
    filter: new OpenLayers.Filter.FeatureId({fids: ["2242"]}),
    symbolizer: {
        externalGraphic: "OpenLayersRotationExample_files/marker-red.png",
        graphicWidth: 21,
        graphicHeight: 25,
        graphicXOffset: -10,
        graphicYOffset: -12
    }
});
myStyle.addRules([defRule]);

...

vectors = new OpenLayers.Layer.Vector(
   "Simple Geometry",
   {
      protocol: new OpenLayers.Protocol.Script({
        url: "http://localhost:8181/view",
        callbackKey: "format_options",
        callbackPrefix: "callback:",
        filterToParams: function(filter, params) {
          if (filter.type === OpenLayers.Filter.Spatial.BBOX) {
            params.bbox = filter.value.toArray();
            if (filter.projection) {
              params.bbox.push(filter.projection.getCode());
            }
          }
          return params;
        }
      }),
      strategies: [
        new OpenLayers.Strategy.Refresh({force: true, interval:10000}),
        new OpenLayers.Strategy.BBOX({resFactor:2})
      ],
      styleMap: new OpenLayers.StyleMap({
        "default": myStyle
      })
   }
);


Но в итоге я ничего не вижу.  

В связи с этим вопрос - как правильно писать правила и фильтры OpenLayers?
Буду признателен за полезные ссылки на примеры и примеры использования разных фиьтров,
в частности FeatureId (желательно более понятных чем тут "Filtering a WFS Layer").  

PS: Пока решил так:

var myStyle = new OpenLayers.Style();
var defRule = new OpenLayers.Rule({
  symbolizer: {
    externalGraphic: "OpenLayersRotationExample_files/marker.png",
    graphicWidth: 14,
    graphicHeight: 17,
    graphicXOffset: -7,
    graphicYOffset: -8,
    graphicOpacity: 0.9,
    rotation: "${course}",
    display: "none"
  }
});
myStyle.addRules([defRule]);
for (keyVar in arr) {
  myStyle.addRules([
    new OpenLayers.Rule({
      filters: [new OpenLayers.Filter.Comparison({
        type: OpenLayers.Filter.Comparison.EQUAL_TO,
        property: "vid",
        value: arr[keyVar]
      }),
      symbolizer: {
        externalGraphic: "OpenLayersRotationExample_files/marker-red.png",
        display: ""
      }
    })
  ])
}

//arr - список id объектов которые нужно показать
//vid, course - поля свойств объектов (properties)


Возможно не очень красиво и медленно, но работает. Кто знает как разобраться с FeatureId,
прошу подскажите - все таки, я думаю, он быстрее отработает чем куча фильтров.
    


Ответы

Ответ 1



У вас JSON не полный. У каждой feature должен быть некоторый "id", по которому фильтровать фильтром FeatureId.

Готовые наборы тайлсетов для игр

#c_sharp #xna #графика #разработка_игр #2d

                    
Доброго времени суток, Хэшкод.

В свободное от работы время начал потихоньку изучать xna. Подготовил двумерный изометрический
тайловый движок, даже нашел подходящий редактор под него, однако осталась одна проблема
- нашел очень мало нормальных тайлсетов. Художник и дизайнер из меня, прямо скажу,
аховый, так что вариант "нарисовать самому" я оставляю на самый крайний случай. При
попытке найти что-то в сети в основном получаю какой-то лохматый "ужос"... В общем
- не нашел.

Собственно у меня вопросы:


Есть ли сайты, на которых есть нормальные тайлсеты?
Есть ли нормальные редакторы для создания тайсетов? (можно конечно и в Paint-е(Gimp-е/Photoshop-е)
что-то наваять, но с моими навыками "рисования"... в общем, хотелось бы что-то более
специализированное)


Пример тайлсета, если кто не знает, что это такое:


[upd] Да, вопрос получился конечно не по программированию, но извиняюсь. Больше мне
спрашивать негде.
    


Ответы

Ответ 1



Вы когда нибудь пробовали собрать toolbar для оконного приложения с помощью сайта который представляет бесплатные иконки от разных людей? Ваш toolbar получится не ахти, так как все иконки будут нарисованы разными людьми в разном стиле и цветовой гамме. Даже если вы будете долго копаться на нескольких таких сайтах в поисках единого стиля, то наврятли получится что-то стоящее, т.к. совершенно не факт что вы найдете даже готовый набор полностью удовлетворяющий вашим нуждам. Тоже самое и с тайлсетом. Их все должен рисовать один человек в одном стиле по одному документу, на gamedev.ru и фриланс сайтах есть десятки людей которые с радостью возьмутся выполнить такой заказ по вполне адекватной цене(реальная рыночная цена тому что вы приводите в качестве примера не больше 100-300 рублей за полоску), да и качество будет вполне ничего, если вы конечно потрудитесь отобрать достойного кандидата. В качестве редактора можно использовать Photoshop и 3DSMax ну или Blender и GIMP если вы красноглазик. Специальный редактор для тайлсетов это плохая идея потому что непонятно чем собственно тайлсет отличается от обычной картинки. Самому рисовать их ни в коем случае нельзя, так как если у вас нет хотя бы пары лет опыта работы с графическими редакторами и хотя бы зачатков умений художника, то в лучшем случае у вас получится результат которым можно только пугать других людей. С другой стороны с попытки с 50ой может и получится что-нибудь хорошее, но тогда вы просто потеряете время. Правда есть и альтернативный вариант: http://lunar.lostgarden.com/labels/free%20game%20graphics.html http://hasgraphics.com/ http://cgtextures.com/ http://blogoscoped.com/archive/2006-08-08-n51.html http://www.freewebs.com/teh_pro/sprites.htm http://www.spriters-resource.com/ http://www.flyingyogi.com/fun/spritelib.html http://www.gamedev.net/topic/272386-sprites-sprites-and-more-sprites/ P.S. Собирать игры в качестве хобби это плохая идея, так как это требует очень много свободного времени и усилий. Нужно либо делать это нормально либо вообще не делать.

Ответ 2



Что касается сайтов с нормальными тайлсэтами - никогда не встречал, что касается редакторов - такие, безусловно, есть, но они никак не изменяют того факта, что нужно уметь рисовать, учитывая их более ограниченный функционал, большего смысла в них не вижу, разве что, обычно, удобно сразу рисовать сэт. Вообще, для того, что-бы научится хоть более менее нормально рисовать оные, великих навыков художника не требуется, все, чему нужно научится - базовым навыкам передачи светотени и объема. К тому-же, нет людей, которые не умеют рисовать, есть только те, которые не научились. Плюс ко всему, если рисовать не на бумаге, можно сделать, допустим, размерность 2к*2к px, при уменьшении которой, многие косяки изображения исчезнут, главное правильно передать объем и более менее правильно светотень. Даже если совсем не будет получатся - можно поискать начинающего художника и попросить нарисовать его, но, повторюсь - такое рисование не требует великих навыков, другой вопрос в том, достаточно ли у вас времени и желания?..

Где лучше хранить двоичные данные: в БД или отдельном файле? [ASP.NET MVC 3]

#c_sharp #net #sql_server #aspnet_mvc

                    
Доброго времени суток.
Есть база данных в которой хранятся учётные записи пользователей. К каждому пользователю
привязаны два двоичных файла. Первый файл занимает около 30КБ, второй занимает около
300КБ. Со временем количество пользователей может исчисляться сотнями тысяч.
Первый вариант - хранить эти данные в базе данных. Поле Data в таблице будет иметь
тип varbinary(MAX):
public ActionResult GetWorld()
{
    var world = db.GetWorld(...);

    return File(world.Data, "application/octet-stream");
}

public ActionResult SaveWorld(HttpPostedFileBase worldData)
{
    var world = db.GetWorld(...);

    world.Data = new byte[worldData.ContentLength];
    worldData.InputStream.Read(world.Data, 0, worldData.ContentLength);
}

Второй вариант - хранить эти данные в виде отдельных файлов:
public ActionResult GetWorld()
{
    var world = db.GetWorld(...);

    string pathToWorldData = Server.MapPath(
        string.Format("~/App_Data/Worlds/{0}.dat", world.Id));

    return File(pathToWorldData, "application/octet-stream");
}

public ActionResult SaveWorld(HttpPostedFileBase worldData)
{
    var world = db.GetWorld(...);

    string pathToWorldData = Server.MapPath(
        string.Format("~/App_Data/Worlds/{0}.dat", world.Id));

    worldData.SaveAs(pathToWorldData);
}

Есть ещё другой вариант - varbinary(MAX) и FILESTREAM, но чем он по сути отличается
от второго? Только будет много возни в коде.    


Ответы

Ответ 1



Если хранить данные как поле таблицы, база будет пухнуть. Использование опции FILESTREAM позволяет хранить данные как отдельные файлы, но при этом с поддержкой транзакционности. Правда, лог базы данных всё равно будет пухнуть, его надо будет чистить периодически. Теперь о проблемах. FILESTREAM работает только с Windows-аутентификацией при обращении к БД. Возможно, я чего-то не нашёл, но по-другому у меня не получилось. В сочетании с тем, что диспетчер служб Windows любит терять пароли после пары перезагрузок, работать с этой опцией становится совсем весело. Ещё у меня была такая фигня, что после установки какого-то из обновлений Windows её было не включить. С учётом того, что Microsoft любят добавлять всё время новые возможности своих продуктов, не доводя до ума старые, используйте лучше файлы. Если так надо сделать поддержку транзакционности, посмотрите в сторону распределённых транзакций.

Ответ 2



Бинарные данные лучше хранить в файлах. Картинки, видео и музыку никто не хранит в БД. Не стоит лишний раз все усложнять. Для хранения большого количества файлов обычно создают множество подпапок, например можно хранить файлы для первой тысячи записей в папке /0/, для второй в /1/ и т. д.

Ответ 3



ну если есть деньги, то в БД, т.к. 500 мегабайт стандартно вроде, дальше уже доп $$$ а также из базы дольше дергаться будет, факт поле надо выбирать не varchar точно, раз ты байты будешь там хранить, лучше уж varbinary (кстати, для xml файлов есть тип xml в 2008) я бы посоветовал только путь к файлам хранить в БД, а файл дергать из файловой системы

Xml-сериализация атрибутов вложенных узлов в свойства объекта

#c_sharp #xml #net

                    
Подскажите пожалуйста, есть ли возможность десериализовать Xml-элемент подобной структуры:
  
    
    
    
  

в объект примерно такого класса:
[XmlRoot("Service")]
public class Service
{
    public string Host { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

То есть смысл в том, чтобы не создавать для каждого вложенного узла свой класс, наподобие
этого:
public class Host
{
    [XmlAttribute("value")]
    public string Value { get; set; }
}

и затем не городить огород:
[XmlRoot("Service")]
public class Service
{
    [XmlElement("Host")]
    public Host Host { get; set; }
    .
    .
    .
}

...

var host = service.Host.Value;

Хочется верить, что атрибуты "value" всех вложенных узлов можно сразу замапить на
string-свойства. Буду благодарен за любой совет.    


Ответы

Ответ 1



Может быть, пусть Service имплементирует интерфейс IXmlSerializable и реализует ReadXml разумным образом? Сделать это только при помощи атрибутов невозможно: свойства определяют либо такой: http://domain.com:80 user_name password либо такой синтаксис. Я тут набросал код: [XmlRoot] class Service : IXmlSerializable { string Host; string Username; string Password; XmlSchema IXmlSerializable.GetSchema() { return null; } void IXmlSerializable.ReadXml(XmlReader reader) { if (reader.IsEmptyElement) // проверяем формат throw new Exception(); // надо какое-то другое исключение, конечно reader.ReadStartElement(); // читаем открывающий тег Service while (reader.IsStartElement()) // пока есть вложенные теги... processNode(reader); // читаем их reader.ReadEndElement(); // читаем закрывающий тег } void processNode(XmlReader reader) { if (!reader.IsEmptyElement) // опять проверяем формат throw new Exception(); if (reader.AttributeCount != 1) // то же самое throw new Exception(); string name = reader.Name; string value = reader.GetAttribute(0); setField(name, value); reader.ReadStartElement(); // переходим к следующему } void setField(string name, string value) { switch (name) // ну или reflection, если хотите { case "Host": Host = value; break; case "Username": Username = value; break; case "Password": Password = value; break; } } void IXmlSerializable.WriteXml(XmlWriter writer) { serializeField(writer, "Host", Host); serializeField(writer, "Username", Username); serializeField(writer, "Password", Password); } void serializeField(XmlWriter writer, string name, string value) { writer.WriteStartElement(name); writer.WriteStartAttribute("Value"); writer.WriteString(value); writer.WriteEndElement(); } }

Как писать приложения под android на C#? [закрыт]

#c_sharp #aspnet #android #net

                            
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
            
                    
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 4 года назад.
                    
                
        

Я asp.net разработчик, и хочу изучить android разработку. Не собираюсь переходить
на android разработку, поэтому не хочу вложить много времени в изучение, но базовые
вещи для написания приложений очень хотелось бы знать. Что нужно для android разработки:
платформа, книги, полезные материалы и тд?
    


Ответы

Ответ 1



Вообще если уж так захотелось писать под Android именно на Шарпе, то могу сказать, что небезызвестная компания Xamarin (та, что реализует .NET под прочие, отличные от Windows, платформы) около года тому назад объявила о выпуске проекта Mono for Android, о чем неоднократно писалось наХабре (вот, вот и вот). Официальный сайт сего чудо-проекта находится тут (с кучей документации, между прочим. Впрочем, качество этой кучи оценивать не берусь). Господа из Xamarin, между прочим, утверждают, что их реализация работает куда как быстрее, чем Dalvik. Но, надо сказать ,что бесплатно вы сможете отлаживать свое творчество только под эмулятором. Отладка на реальном устройстве возможна лишь при покупке лицензии. Ну и еще есть книга по разработке под Android с помощью Mono (кстати говоря, полагаю, что подобной литературы на два порядка меньше, чем для разработчиков на Java)

Ответ 2



платформа - любая, но лучше Linux книги - любые, главное не русскоязычные ("виды" и "деятельности" меня коробят) полезные материалы - d.android.com и самое главное - нужно немного призабыть шарп и выучить Java.

Ответ 3



Кроме упомянутого моно есть dot42. Компилятор шарпа в дальвик (Проект еще молодой, но для простых приложений сгодиться).

DataGrid: привязка данных

#c_sharp #wpf

                    
DataGrid привязан к таблице в БД с помощью перетаскивания из окна "Источники данных".
Как сделать чтобы изменения, внесенные в DataGrid, заносились в таблицу в БД, т.е.
изменяли ее?    


Ответы

Ответ 1



Если Вы работаете с MS SQL сервером (про MySql и другие ничего сказать не могу, но помоему для большинства из них такое тоже есть), то можно использовать SqlDataAdapter + SqlCommandBuilder. Причем если выборки не сложные (без JOIN'ов), то SqlCommandBuilder сам сгененрирует инструкици добавления/удаления/обновления. Если же выборки не простые, то, на сколько я помню, эти инструкции придется прописывать самому. Если заинтересует, то могу привести небольшой пример.

Ответ 2



Надо вручную писать код, например грид выглядит так: ID -ФИО- Арес-дата_рождения и т.д. Хранить можно это дело классе, в котором сделать оператор set. пользователь меняет адрес(или что-то др.) и надо создать запрос на изменение update. (смотри SQL) Привязываешь метод в set {....} и всё. Ну или создаёшь кнопку - Сохранить, которая сохраняет значения строки, на которой стоит курсор в гриде (обращаешься к выделенной строке(или создаёшь "скрытый" едитбокс, который забинден на определённое поле и с него читаешь инфу и также делаешь запрос update))

Глобально отслеживать нажатия клавиш

#c_sharp #события

                    
Как глобально (не в рамках моего приложения) отследить нажимаемые комбинации клавиш
и, если, к примеру, комбинация CTRL+Q то активировать мое приложение? Перенести фокус
то бишь. Ну или на какой-либо элемент в нем. TextBox, например.
Спасибо!    


Ответы

Ответ 1



Посмотрите сюда: MSDN/Hooks overview. Учтите, что с такими трюками ваше приложение не получит Vista Logo (и более поздние сертификации): благопристойной программе не к чему шпионить за другими программами.

Ответ 2



Можно использовать такую подтехнологию WinAPI, как хуки( HOOKS ). Вообще, внедрение низкого уровня в C# - дело не клевое, так как .NET предоставляет массу высокоуровневых( и наиболее удобных, кстати говоря ) замещений WinAPI функциям. Но, если б я столкнулся с вашей задачей, вероятно, я бы решил ее именно так: HOOKPROC hkprcSysMsg; static HINSTANCE hinstDLL; static HHOOK hhookSysMsg; hinstDLL = LoadLibrary(TEXT("c:\\myapp\\MyHookDLL.dll")); hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "MyHookProc"); hhookSysMsg = SetWindowsHookEx( WH_KEYBOARD, hkprcSysMsg, hinstDLL, 0); Доки. При этом нажатия клавиш( и их комбинаций ) будет перехвачено глобально, на уровне системы, созданным вами хуком.

Ответ 3



EasyHook starts where Microsoft Detours ends. This project supports extending (hooking) unmanaged code (APIs) with pure managed ones, from within a fully managed environment like C# using Windows 2000 SP4 and later, including Windows XP x64, Windows Vista x64 and Windows Server 2008 x64. Also 32- and 64-bit kernel mode hooking is supported as well as an unmanaged user-mode API which allows you to hook targets without requiring a NET Framework on the customers PC. An experimental stealth injection hides hooking from most of the current AV software. http://easyhook.codeplex.com/

Ответ 4



Смотрите в сторону winapi, в шарпе нет возможности взаимодействовать напрямую с неподготовленными приложениями.

Не получается создать базу данных

#c_sharp #aspnet_mvc #visual_studio

                    
Добрый день.
Проблема описана ниже.
 Выдержка из учебника:
 "... база данных добавляется в проект, и мы можем увидеть ее в папке App_Data. Теперь
в обозревателе баз данных (окно Database Explorer) мы можем подключиться к ней и создать
таблицы, которые будут хранить данные.
 Раскроем узел Creditbook.mdf и найдем узел Tables. Нажмем на этот узел правой кнопкой
мыши и в появившемся меню выберем пункт Add New Table."
У меня нет пункта Add New Table, есть только Обновить и Свойства. (У меня стоят SQL
Server и Management Studio). 
 Вот тут (http://www.sql.ru/forum/1038127/redaktirovanie-bd-v-s), у человека была
такая же проблема, но я всё равно не понял, что нужно делать. 
 Заранее спасибо за помощь.    


Ответы

Ответ 1



Нужно установить SQL Server Data Tools Проверял на Visual Studio 2015.

Ответ 2



Либо зайдите под админом в студию, либо поставьте себе SqlManagementStudio.

Ответ 3



Базу после создания таблицы нужно обновить, тогда вновь созданная таблица станет доступна (кнопка обновления прямо над ID).Обозреватель баз данных после данных действий также обновить желательно (кнопка левый верхний угол). В остальном все правильно работает.

Ответ 4



Для меня решение было таким: в VS жмем Tools->Extensions and Updates, выбрал обновление для VS, дальше надо поставить галочки, подождать пока установится и все заработает. По крайней мере у меня заработало.

Google Chrome в приложении Win forms

#c_sharp #google_chrome #winforms

                    
Пишу приложение на С#, в котором хотелось бы увидеть браузер crome для использования
google speech. Использовал awesomium, которым открыл страницу но google speech он не
поддерживает. Т.е. Нужен именно хром в моем приложении. Может кто сталкивался с подобным.
Заранее спасибо    


Ответы

Ответ 1



How to develop Desktop Apps using HTML/CSS/JavaScript? Перевод принятого ответа: Можно начать с Titanium'а для десктопной разработки. Также стоит обратить внимание на chromiumembedded. Это по сути контрол веб-браузера, основанного на хромиуме. Он написан на C++ и позволяет использовать все низкоуровневые возможности ОС (Growl, иконки в трее, доступ к локальным файлам, com-порты и т. д.) и при этом писать всю логику и интерфейс приложения на html и javascript. Он также позволяет перехватывать любые http-запросы, чтобы обратится к локальным ресурсам или выполнить особые действия. Например, запрос на http://localapp.com/SetTrayIconState?state=active может быть перехвачен контейнером, который вызовет код на Си++ чтобы обновить иконку в трее. Он позволяет создавать функции, которые могут непосредственно вызываться из js. Но в CEF очень сложно отлаживать js. Там нет ничего похожего на Firebug. Ещё можно посетить AppJS.com (Помогает создавать десктопные приложения под Linux, Windows и Mac используя HTML, CSS и JavaScript). Как дополнил @Clint, команда Bracket.io (Adobe) используя Chromium Embedded Framework создала замечательную оболочку. Она называется brackets shell. Также доступно её описание.

Ответ 2



Возможно, это или вот это будет вам полезно

Ответ 3



Selenium Webdriver под кучу языков идет на ура. Из личного опыта я с ним работаю больше года в Visual Basic 2008