Разработка компонента библиотеки карточек

Так же, как и для карточки, реализация библиотеки предусматривает два основных этапа: создание описания (схемы) библиотеки в формате XML и реализация программного компонента.

Основная задача компонента библиотеки карточек — это кэширование XML-описаний (схем) и иконок всех карточек, входящих в библиотеку. Это избавляет клиентов от необходимости выполнять запрос к серверу при каждом обращении к метаданным карточек и, таким образом, существенно повышает производительность их работы.

Помимо этого, по наличию или отсутствию регистрации данного компонента на клиентской машине определяется сам факт установки решения в целом.

Если решение зарегистрировано в базе данных, но при запуске Windows-клиент не может создать компонент библиотеки карточек, им будет предпринята попытка заново установить инсталляционный пакет решения на данной машине. В случае неудачи будет выдано сообщение о том, что библиотека карточек некорректно установлена.

По этой причине компонент библиотеки карточек является обязательной частью законченного решения. Его создание может быть пропущено или отложено в процессе разработки карточек решения (в пределах компьютера разработчика), но к нему обязательно необходимо будет вернуться при распространении созданного решения.

Компонент библиотеки карточек является реализацией интерфейса ICardLibraryInfo, который определяет методы получения информации о библиотеке. Данный интерфейс реализован в классе DocsVision.Platform.WinForms.CardLibrary, который можно использовать в качестве базового в собственных реализациях компонентов библиотек карточек. При этом нужно переопределить методы: GetIcon, GetCardIcon, GetLibraryDefinition и GetCardDefinition.

Номер версии в сборке библиотеки (assemblyVersion.FileVersion), должен совпадать с номером версии, который указан в XML-описании библиотеки. В противном случае будет появляться предупреждение о несовпадении версий библиотеки на сервере и на клиенте.

В код проекта также необходимо включить ресурсный файл, который будет содержать иконки и XML-описания карточек, входящих в библиотеку, а также XML-описания самой библиотеки карточек. Такой файл можно создать при помощи встроенного редактора Visual Studio. А чтобы избежать дублирования, можно просто вставить в ресурсный файл ссылки на файлы из проекта, например следующим образом:

<data name="Icon_TestCard" type="System.Resources.ResXFileRef, System.Windows.Forms">
  <value>..\..\CardDefs\Icons\TestCard.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>

<data name="Definition_TestCard" type="System.Resources.ResXFileRef, System.Windows.Forms">
  <value>..\..\CardDefs\TestCard.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>

У ресурсного файла обязательно необходимо установить атрибут build action — embedded resource

Если при помощи нового инсталляционного пакета или пакета исправлений производится обновление сборки, содержащей компонент библиотеки карточек, может потребоваться перезагрузка приложения.

Если этот момент является критичным, то при разработке собственного решения рекомендуется реализовывать компонент библиотеки карточек как COM-класс, реализующий интерфейс ICardLibraryInfo и ICardLibraryInfo2.

Пример базового кода компонента библиотеки:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using DocsVision.Platform.WinForms; (1)

namespace DocsVision.Test
{
    [ComVisible(true)]
    [Guid("9FD12D2E-F17F-4CCC-8598-38A52513E970")]
    [ClassInterface(ClassInterfaceType.None)]
    public class TestCardLib : CardLibrary
    {
        public TestCardLib() { }

        public override Icon GetIcon() (2)
        {
            return Resources.TestCardLibIcon;
        }

        public override Icon GetCardIcon(Guid cardTypeID) (3)
        {
            if (cardTypeID = TestCard.ID)
                return Resources.TestCardIcon;
        }

        public override string GetCardDefinition(Guid cardTypeID) (4)
        {
            if (cardTypeID = TestCard.ID)
                return Resources.TestCardDefinition;
        }

        protected override string GetLibraryDefinition() (5)
     {
            return Resources.TestLibDefinition;
        }
    }
}
1 Особенность подключения пространства имён класса CardLibrary: если реализуется WinForms компонент, то CardLibrary определён в пространстве имён DocsVision.Platform.WinForms, если WPF — в пространстве имён DocsVision.Platform.Wpf.
2 Определение иконки для библиотеки.
3 Определение иконки для карточек, в данном случае только для типа TestCard.
4 Возвращает XML-описание карточки, в данном случае только для типа TestCard.
5 Возвращает XML-описание библиотеки карточек.