Андрей,
Мои пять копеек:
1) Если на вход System.Convert.ToDouble(value) передаётся строка, то результат зависит от текущей системной локали. Если на вход передать строку "123,456", а локаль будет английская, то результат будет 123456, а если системный язык, скажем, немецкий, то будет 123.456. А если русский, то метод вообще упадёт. Очень опасный метод. Если тип неизвестен, лучше делать так:
2) throw new NotFiniteNumberException(); если конвертер не умеет конвертировать в обратную сторону, лучше кидать NotSupportedException/NotImplementedException.
Привязываться к IP-адресу - не самая лучшая идея, особенно если сайтом предполагается пользоваться с мобильных устройств, которые постоянно переключаются между мобильными и wifi-сетями.
На трэшовые вопросы - трэшовые ответы. Я понимаю, что у человека может не быть достаточного опыта, чтобы корректно сформулировать вопрос. Но правило "не бывает плохих вопросов" в данном конкретном случае не работает. Этот вопрос откровенно плох, и наверняка не возник бы, если бы автор ознакомился с основами программирования.
Можно бесконечно отвечать на простейшие вопросы, как воспитатели в детском саду. Но можно указать на пробелы в знаниях, которые необходимо устранить для дальнейшего развития.
Майкл Васюков, вот обзорная страница на вики [англ]. Самый интересный раздел - "Technical challenges". Отсюда можно отталкиваться. А конкретные технологии вам вряд ли кто-то подскажет.
Всё-таки, не понятно, что вы хотите сделать. Систему контроля версий файлов или онлайн-редактирование файлов, где все участники группы могут одновременно редактировать один файл и видеть чужие правки.
Но, если честно, обе задачи крайне сложны, даже для программистов с многолетним опытом. Я бы выбрал что-нибудь попроще для обучения.
Дмитрий Башинский, да не так чтобы плохим, но... В отдельные сборки принято помещать логически изолированные модули, которые могут быть переиспользованы. Если вы планируете Model использовать где-то ещё, кроме вышеобозначенной сборки ViewModel (и WPF, как следствие), то всё в порядке. Но если это законченная иерархия классов, то я бы рекомендовал поместить всё в одну сборку. Так и билдиться будет быстрее, и Студия шустрее будет работать. Да и сама программа будет чуть быстрее.
>> Я бы не рекомендовал использовать [ILMerge]
Можно пояснить, откуда такая антипатия? В 99% случаев "контейнер" (если я правильно понял, вы имеете в виду объединение кода в одну сборку) - идеальное решение и более производительное, чем чтение сборки из ресурсов. Да, могут быть проблемы при использовании рефлексии, но это как раз тот 1%, когда объединять сборки воедино не следует.
Про неуправляемый код - тут согласен, ILMerge не справится. В этом крайне редком случае можно использовать Fody.
Писал без Студии, забыл написать this.
Что касается ProgressEventArgs - вы хоть обратили внимание, что этот класс находится в System.Management.dll? Вы всегда добавляете референс на сборку, если вам требуется использовать оттуда двухстрочный класс?
Если уж говорить про правильную имплементацию прогресс-бара, то надо использовать Progress<T>
Правильно ли я понимаю, что во втором случае сам объект имплементирует метод валидации? В таком случае я могу создать такой объект, который будет всегда возвращать true, независимо от алгоритма валидации. Кажется, это неправильно.
Кирилл Серов, Скорее всего, сборка ExcelApi.dll зарегистрирована в GAC. Проверить это можно так: gacutil /l ExcelApi (возможно, надо добавить ".dll", точно не помню)
Если у вас в .csproj файле указано <Project ToolsVersion="4.0">, то вероятно дело в GAC-е.
Это известная проблема MSBuild, но кажется, её пофиксили в последних версиях (ToolsVersion="14.0").
Мои пять копеек:
1) Если на вход
System.Convert.ToDouble(value)
передаётся строка, то результат зависит от текущей системной локали. Если на вход передать строку "123,456", а локаль будет английская, то результат будет 123456, а если системный язык, скажем, немецкий, то будет 123.456. А если русский, то метод вообще упадёт. Очень опасный метод. Если тип неизвестен, лучше делать так:2)
throw new NotFiniteNumberException();
если конвертер не умеет конвертировать в обратную сторону, лучше кидать NotSupportedException/NotImplementedException.