Wednesday, May 25, 2011 5:48:14 PM
Столкнулся со странной вещью: если кликнуть на файле драйвера oemsetup.inf правой кнопкой мыши и сказать install, то выскакивает сообщение об ошибке "INF файл не поддерживает данный метод установки".
Это борется как всегда из командной строки (с правами администратора):
pnputil -i -a oemsetup.inf
Дело было в Windows 2008 Server R2.
Thursday, January 27, 2011 10:26:05 PM
Пример коммерческого способа фиксить баги (Microsoft's way).
Речь пойдет о классе System.IO.FileStream, метод Flush.
Предыдущие фреймворки (до 3.5 включительно
) содержат проблему, актуальную при работе с файлами особой важности. Если быть точным, метод Flush() не делает того, что по идее должен делать. Он не записывает содержимое буферов на диск. В итоге возможна ситуация, когда вы сказали Flush() (выполнен и завершен успешно), затем вырубилось питание (например) -- и важнейший файл с БД ваших швейцарских счетов или с вашими свежими криптосертификатами остаётся поврежденным.
Но вы ведь сделали Flush()! 
Раньше использовалось 3 пути обойти проблему:
- Выставить при открытии потока опцию FileOption.WriteThrough. Если верить мсдн, то в этом случае никакая буферизация не выполняется и все данные немедленно пишутся на диск. Этот способ подходит для однократной операции создания файла с последующим пакетным наполнением его данными, потому что он медленный.
- В дополнение к Flush() сразу же делать Close() + Open(). Это тоже медленный способ, но хотя бы запись на диск выполняется медленно когда вы к этому готовы.
- Использовать P/Invoke винапи функции extern void FlushFileBuffers(SafeFileHandle). Этот метод ужасен
. Во-первых, он требует выполнения дополнительных телодвижений после Flush(), включая отдельно получение, проверку и обработку состояния ошибки, которая может тихонько возникнуть при вызове функции. Во-вторых, но полностью ломает любые потуги вашей сборки быть кросс-платформенной.
Вступление позади. Теперь внимание! Свежая бага .NET Framework 4.0!!! (Открыта 3 января 2011 года под номером 634385. Сегодня ещё только 27.01.2011.)
Бага состоит в том, что в этой версии был специально добавлен перегруженный метод FileStream.Flush(bool), в котором должна была быть сделана форсированная запись данных на физическое устройство.
Так вот, согласно этой официальной баге, он не работает так, как это предусмотрено его спекой!!! В настоящее время баг помечен как "Resolved-Fixed" с комментарием "баг будет исправлен в следующей версии продукта".
Я считаю, что это прекрасная демонстрация того отношения к пользователям и клиентам, которая свойственна этой фирме при решении обнаруживаемых в её продуктах проблемах.
Хорошего кода и пусть вам никогда не придется пинвоучить
!
Wednesday, January 26, 2011 11:01:40 PM
Понадобилось решение для реализации файловой БД. Сначала хотел SQLite, но там жуткий лимит по типам данных. Сразу заскучал и обратил взор на объектную СУБД Db4Objects.
На сайте заявлено: "Совместимость с .NET 2.0, 3.5, 4.0 и полная поддержка mono".
Поскольку моя домашняя среда разработки на данный момент Ubuntu Linux v10.04 (Lucid) 64bit + mono v2.8.1 + MonoDevelop v2.4, то это показалось идеальным вариантом. Плюс опыт по использованию объектной СУБД может быть полезным. Язык программирования, понятно, C#.
Скачал требуемые сборки в виде zip-архива (версия 7.12 уровня Production), распаковал, забацал простенький проект и... и началось веселье.
Зверёк падал с невразумительным стек-трейсом прямо на строчке открытия файла с БД. Проблема оказалась в том, что по умолчанию они отдают файлы для Win. А для Win умудрились заюзать P/Invoke (сброс файловых кешей, кажется). В линуксе он естественно падает. Отдельной версии под mono мне найти не удалось, только несколько указаний на то, что "под mono надо всё собирать самому из исходников". Так что готовьте svn-клиент.
Чтобы не париться сильно со свежими багами, выкачал только ту ревизию, из которой была собрана "продакшен" версия 7.12. Это ревизия 14589, кстати.
В сорсах лежат стопки солюшенов под разные версии студий и, соответственно, разные фреймворки. Из MonoDevelop прекрасно открываются солюшены под студии 2005, 2008. 2010 не пробовал.
Здесь внимание: для каждого проекта, который вам нужен, необходимо объявить переменную MONO для компиллятора (в дополнение к переменным DEBUG, TRACE, NET_2_0, NET_3_5 и т. д.). Коллеги активно пользуются условными директивами препроцессора.
После указания этой переменной, прекрасно проходит билд всех необходимых сборок (включая поддержку LINQ).
С этого места осталось только проапдейтить референсы проекта и насладиться результатом: действительно сохраняет; действительно потом загружает и ищет записи линковскими запросами.
Зачем им понадобился P/Invoke и почему нет отдельного ГОТОВОГО файла с адаптированными сборками для mono мне даже узнавать не хочется!
PS На форуме гуру пишет, что успешно хранит в базе 100 000 000 строк данных и проблем с производительностью не испытывает. Проверю!
И ещё интересно: есть ли у них партиционирование???...
Friday, May 14, 2010 2:49:05 PM
Не все возможности программ выносят в GUI, особенно если UI -- это только обертка вокруг какой-то консольной утилиты.
Вот и с Team Foundation Server 2008 можно общаться из коммандной строки. Утилита называется tf.exe.
1. Посмотреть список рабочих областей на сервере:
tf workspaces /s:http://<tfServer>:<port> /computer:<devCompName>
2. Посмотреть подпапки в области:
tf workfold /s:http://<tfServer>:<port> /workspace:<wSpace>
3. На чистой машине перед первым чекаутом надо создать новый воркспейс:
tf workspace /new /s:http://<tfServer>:<port> /computer:<devCompName> /comment:("Workspace for dev comp.")
4. Первая закачка исходников:
tf get
Thursday, April 29, 2010 2:55:10 PM
Разработчики MonoDevelop обещают выпустить версию 2.4 в конце мая 2010-го года. Согласно их планам, в этой версии ожидается масса вкусного.
Со своей стороны могу добавить, что даже в текущей версии 2.2 работает запуск проекта в режиме Debug с пошаговым выполнением инструкций.
С нетерпением жду июня, чтобы всё самому попробовать! 
Monday, February 02, 2009 4:52:34 PM
How to: Create Project Templates
To create a custom project template with the Export Template wizard
-
Create a project.
Note: |
|
Use only valid identifier characters when naming a project that will be the source for a template. A template exported from a project named with invalid characters can cause compilation errors in future projects based on the template. For more information on valid identifier characters, see Declared Element Names.
|
-
Edit the project until it is ready to be exported as a template.
-
As appropriate, edit the code files to indicate where parameter replacement should take place. For more information on parameter replacement, see How to: Substitute Parameters in a Template.
-
On the File menu, click Export Template. The Export Template wizard opens.
-
Click Project Template.
-
If you have more than one project in your current solution, select the project you want to export to a template.
-
Select the type of template that you want to create.
-
Click Next.
-
Select an icon for your template. This icon will appear in the New Project dialog box.
-
Enter a template name and description.
-
Click Finish. Your project is exported into a .zip file and placed in the specified output location, and, if selected, imported into Visual Studio.

See Also
Friday, January 30, 2009 6:38:51 PM
Валидируем описание шаблона
Чтобы сделать редактирование файла vstemplate более комфортным, присоединим к нему валидацию на основании XSD схемы.
По этому адресу можно найти перечень разрешенных тегов.
Friday, January 30, 2009 6:29:25 PM
How to: Substitute Parameters in a Template
You may replace template parameters such as class names and namespaces when a file based on a template is created. For a complete list of template parameters, see Template Parameters.

Procedure
You may replace parameters in the files of a template whenever a project based on that template is created. This procedure explains how to create a template that replaces the name of a namespace with the safe project name when a new project is created with the template.
To use a parameter to replace namespace name with the project name
-
Insert the parameter in one or more of the code files in the template. For example:

namespace $safeprojectname$
Note: |
|
Template parameters are written in the format $ parameter$.
|
-
In the .vstemplate file for the template, locate the ProjectItem element that includes this file.
-
Set the ReplaceParameters attribute to true for the ProjectItem element. For example:
<ProjectItem ReplaceParameters="true">Class1.cs</ProjectItem>

See Also
Tasks
Concepts
Reference
Other Resources
Friday, January 30, 2009 6:12:10 PM
Создание многофайлового шаблона (но ещё не проект!)
Чтобы включить в шаблон несколько связанных файлов (типа WinForm) достаточно их все перечислить в тегах TemplateContent/ProjectItem. Чтобы сделать жизнь немного проще, сразу можно добавить параметр шаблона - имя логической единицы (например, имя класса). Примерно так:
<?xml version="1.0" encoding="utf-8" ?>
<VSTemplate Type="Item" Version="2.0.0"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>Template 03</Name>
<Description>Item template</Description>
<Icon>__TemplateIcon.ico</Icon>
<ProjectType>CSharp</ProjectType>
<DefaultName>ComplicatedClass</DefaultName>
</TemplateData>
<TemplateContent>
<ProjectItem TargetFileName="$fileinputname$.cs">
ComplicatedClass.cs
</ProjectItem>
<ProjectItem TargetFileName="$fileinputname$.generated.cs">
ComplicatedClass.generated.cs
</ProjectItem>
</TemplateContent>
</VSTemplate>
Friday, January 30, 2009 6:02:02 PM
How to: Manually Create Item Templates
The process for creating a custom item template is fairly simple. The required items for a project item template are as follows:
-
The metadata file (*.vstemplate) that Visual Studio uses to define how to display the project item in the development environment and, if you have specified the appropriate properties, to customize how the project item is created.
-
The code file, such as a Windows form, Web form, class file, or resource file.
These two files are compressed into a .zip file. The .zip file must be placed in a location recognized by Visual Studio for custom project item templates. Custom project item templates appear in the Add New Item dialog box in the My Templates section for the appropriate programming language.
To manually create an item template
-
Create a project and project item.
-
Edit the project item until it is ready to be saved as a template.
-
As appropriate, edit the code file to indicate where parameter replacement should take place. For more information on parameter replacement, see How to: Substitute Parameters in a Template.
-
Create a new XML file and save it with a .vstemplate extension in the same directory as your new item template.
-
Author the .vstemplate XML file to provide item template metadata. For more information, see the example in the following section.
-
Save and close the .vstemplate file.
-
In Windows Explorer, select the files you want to include in your template, right-click, select Send To, and then click Compressed (zipped) Folder. The files that you selected are compressed into a .zip file.
-
Copy the .zip file into the user item template location. In Windows Vista, the default directory is ..\Users\<username>\Documents\Visual Studio 2008\Templates\ItemTemplates\. For more information, see How to: Locate and Organize Project and Item Templates.

Example
The following example shows a basic item .vstemplate file. This item template contains the metadata for a custom Visual C# class template, MyClass.cs.
<VSTemplate Type="Item" Version="2.0.0"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
<TemplateData>
<Name>MyClass</Name>
<Description>My custom C# class.</Description>
<Icon>Icon.ico</Icon>
<ProjectType>CSharp</ProjectType>
<DefaultName>MyClass</DefaultName>
</TemplateData>
<TemplateContent>
<ProjectItem>MyClass.cs</ProjectItem>
</TemplateContent>
</VSTemplate

See Also
Tasks
Concepts
Reference
Other Resources