Развертывание компонентов COM с помощью ClickOnce

Развертывание устаревших COM-компонентов традиционно было сложной задачей. Компоненты должны быть глобально зарегистрированы и поэтому могут вызывать нежелательные побочные эффекты между перекрывающимися приложениями. Эта ситуация обычно не является проблемой в платформа .NET Framework приложениях, так как компоненты полностью изолированы к приложению или совместимы параллельно. Visual Studio позволяет развертывать изолированные com-компоненты в операционной системе Windows.

ClickOnce предоставляет простой и безопасный механизм развертывания приложений .NET. Однако если приложения используют устаревшие com-компоненты, вам потребуется выполнить дополнительные действия по их развертыванию. В этом разделе описывается развертывание изолированных com-компонентов и ссылок на собственные компоненты (например, из Visual Basic 6.0 или Visual C++).

Дополнительные сведения о развертывании изолированных COM-компонентов см. в статье "Упрощение развертывания приложений с помощью ClickOnce и бесплатной регистрации COM".

Не требующий регистрации COM

Com без регистрации — это новая технология для развертывания и активации изолированных COM-компонентов. Он работает, помещая все сведения о типе компонента и сведения о регистрации, которые обычно устанавливаются в системный реестр в XML-файл, называемый манифестом, хранящимся в той же папке, что и приложение.

Для изоляции COM-компонента требуется, чтобы он был зарегистрирован на компьютере разработчика, но он не должен быть зарегистрирован на компьютере конечного пользователя. Чтобы изолировать com-компонент, необходимо задать для его ссылки изолированное свойство True. По умолчанию это свойство имеет значение False, указывающее, что оно должно рассматриваться как зарегистрированная ссылка COM. Если это свойство имеет значение True, он приводит к созданию манифеста для этого компонента во время сборки. Это также приводит к копированию соответствующих файлов в папку приложения во время установки.

При обнаружении изолированной ссылки COM генератор манифеста перечисляет все CoClass записи в библиотеке типов компонента, сопоставляя каждую запись с соответствующими данными регистрации и создавая определения манифеста для всех классов COM в файле библиотеки типов.

Развертывание компонентов COM без регистрации с помощью ClickOnce

Технология развертывания ClickOnce хорошо подходит для развертывания изолированных com-компонентов, так как для развертывания компонента ClickOnce и бесплатной регистрации COM требуется, чтобы компонент был манифестом для развертывания.

Как правило, автор компонента должен предоставить манифест. Однако в противном случае Visual Studio может автоматически создавать манифест для com-компонента. Создание манифеста выполняется во время процесса публикации ClickOnce; Дополнительные сведения см. в статье "Публикация приложений ClickOnce". Эта функция также позволяет использовать устаревшие компоненты, созданные в более ранних средах разработки, таких как Visual Basic 6.0.

Существует два способа развертывания COM-компонентов ClickOnce:

  • Используйте загрузчик для развертывания com-компонентов; это работает на всех поддерживаемых платформах.

  • Используйте изоляцию собственных компонентов (также называемую развертыванием COM без регистрации).

Пример изоляции и развертывания простого COM-компонента

Чтобы продемонстрировать развертывание com-компонентов без регистрации, в этом примере будет создано приложение на основе Windows в Visual Basic, которое ссылается на изолированный собственный COM-компонент, созданный с помощью Visual Basic 6.0, и развернет его с помощью ClickOnce.

Сначала необходимо создать собственный com-компонент:

Создание собственного COM-компонента
  1. С помощью Visual Basic 6.0 в меню "Файл" нажмите кнопку "Создать", а затем "Проект".

  2. В диалоговом окне "Новый проект" выберите узел Visual Basic и выберите проект БИБЛИОТЕКи DLL ActiveX. В поле Имя введите VB6Hello.

    Примечание.

    Поддерживаются только типы проектов ActiveX DLL и ActiveX с бесплатной регистрацией COM; Типы проектов ActiveX EXE и ActiveX Document не поддерживаются.

  3. В Обозреватель решений дважды щелкните Class1.vb, чтобы открыть текстовый редактор.

  4. В Class1.vb добавьте следующий код после созданного New кода для метода:

    Public Sub SayHello()
       MsgBox "Message from the VB6Hello COM component"
    End Sub
    
  5. Создайте компонент. В меню Сборка выберите Построить решение.

Примечание.

Com без регистрации поддерживает только библиотеки DLL и типы проектов элементов управления COM. Вы не можете использовать EXEs с бесплатной регистрацией COM.

Теперь вы можете создать приложение на основе Windows и добавить ссылку на com-компонент в него.

Создание приложения на основе Windows с помощью COM-компонента
  1. С помощью Visual Basic в меню "Файл" нажмите кнопку "Создать", а затем "Проект".

  2. В диалоговом окне "Новый проект" выберите узел Visual Basic и выберите приложение Windows. В поле Имя введите RegFreeComDemo.

  3. В Обозреватель решений нажмите кнопку "Показать все файлы", чтобы отобразить ссылки на проект.

  4. Щелкните правой кнопкой мыши узел "Ссылки" и выберите " Добавить ссылку " в контекстном меню.

  5. В диалоговом окне "Добавить ссылку" щелкните вкладку "Обзор", перейдите к VB6Hello.dll, а затем выберите ее.

    Ссылка VB6Hello отображается в списке ссылок.

  6. Наведите указатель на панель элементов, выберите элемент управления Button и перетащите его в форму Form1 .

  7. В окне "Свойства" задайте для свойства Text кнопки значение Hello.

  8. Дважды щелкните кнопку, чтобы добавить код обработчика и в файле кода добавьте код, чтобы обработчик считывал следующее:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim VbObj As New VB6Hello.Class1
        VbObj.SayHello()
    End Sub
    
  9. Запустите приложение. В меню отладки нажмите кнопку "Начать отладку".

    Затем необходимо изолировать элемент управления. Каждый com-компонент, который использует приложение, представлен в проекте в качестве com-ссылки. Эти ссылки отображаются в узле "Ссылки" в окне Обозреватель решений. (Обратите внимание, что можно добавлять ссылки напрямую с помощью Добавьте команду "Ссылка " в меню "Проект " или косвенно путем перетаскивания элемента управления ActiveX в форму.)

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

Изоляция COM-компонента
  1. В Обозреватель решений в узле "Ссылки" выберите ссылку VB6Hello.

  2. В окне "Свойства" измените значение изолированного свойства с false на True.

  3. В меню Сборка выберите Построить решение.

    Теперь, когда вы нажимаете клавишу F5, приложение работает должным образом, но теперь оно работает под бесплатной регистрацией COM. Чтобы доказать это, попробуйте отменить регистрацию компонента VB6Hello.dll и запустить RegFreeComDemo1.exe за пределами интегрированной среды разработки Visual Studio. На этот раз, когда кнопка нажимается, она по-прежнему работает. При временном переименовании манифеста приложения он снова завершится ошибкой.

Примечание.

Вы можете имитировать отсутствие COM-компонента, временно отменив регистрацию. Откройте командную строку, перейдите в системную папку, введя cd /d %windir%\system32текст, а затем отмените регистрацию компонента, введя regsvr32 /u VB6Hello.dllего. Его можно зарегистрировать снова, введя regsvr32 VB6Hello.dllтекст.

Последний шаг — опубликовать приложение с помощью ClickOnce:

Публикация обновления приложения с изолированным com-компонентом
  1. В меню "Сборка " щелкните "Опубликовать RegFreeComDemo".

    Откроется Мастер публикации.

  2. В мастере публикации укажите расположение на диске локального компьютера, где можно получить доступ и проверить опубликованные файлы.

  3. Нажмите кнопку Готово, чтобы опубликовать приложение.

    Если вы изучаете опубликованные файлы, обратите внимание, что файл sysmon.ocx включен. Элемент управления полностью изолирован для этого приложения, то есть если компьютер конечного пользователя имеет другое приложение, использующее другую версию элемента управления, он не может препятствовать этому приложению.

Ссылка на собственные сборки

Visual Studio поддерживает ссылки на собственные сборки Visual Basic 6.0 или C++; такие ссылки называются собственными ссылками. Вы можете определить, является ли ссылка машинной, убедившись, что для свойства типа файла задано значение Native или ActiveX.

Чтобы добавить собственную ссылку, используйте команду "Добавить ссылку ", а затем перейдите к манифесту. Некоторые компоненты помещает манифест в библиотеку DLL. В этом случае можно просто выбрать библиотеку DLL, и Visual Studio добавит ее в качестве собственной ссылки, если она обнаруживает, что компонент содержит внедренный манифест. Visual Studio также будет автоматически включать все зависимые файлы или сборки, перечисленные в манифесте, если они находятся в той же папке, что и указанный компонент.

Изоляция элементов управления COM упрощает развертывание COM-компонентов, которые еще не имеют манифестов. Однако если компонент поставляется с манифестом, можно напрямую ссылаться на манифест. На самом деле всегда следует использовать манифест, предоставленный автором компонента, где это возможно, а не с помощью изолированного свойства.

Ограничения развертывания компонента COM без регистрации

Com без регистрации предоставляет четкие преимущества по сравнению с традиционными методами развертывания.

Не каждый компонент является подходящим кандидатом для бесплатной регистрации COM. Компонент не подходит, если какой-либо из следующих значений имеет значение true:

  • Компонент является внепроцессным сервером. Серверы EXE не поддерживаются; поддерживаются только библиотеки DLL.

  • Компонент является частью операционной системы или является системным компонентом, например XML, компонентом браузера или компонентами Microsoft Data Access (MDAC). Следует следовать политике распространения автора компонента; проверка с поставщиком.

  • Компонент является частью приложения, например Microsoft Office. Например, не следует пытаться изолировать объектную модель Microsoft Excel. Это часть Office и может использоваться только на компьютере с полным установленным продуктом Office.

  • Компонент предназначен для использования в качестве надстройки или оснастки, например надстройки Office или элемента управления в веб-браузере. Такие компоненты обычно требуют какой-либо схемы регистрации, определенной средой размещения, которая выходит за рамки область самого манифеста.

  • Компонент управляет физическим или виртуальным устройством для системы, например драйвером устройства для spooler печати.

  • Компонент является распространяемым компонентом Доступа к данным. Приложениям данных обычно требуется установить отдельный распространяемый доступ к данным, прежде чем они смогут запуститься. Не следует пытаться изолировать такие компоненты, как Элемент управления данными Microsoft ADO, Microsoft OLE DB или компоненты Microsoft Data Access (MDAC). Вместо этого Если приложение использует компоненты MDAC или SQL Server Express, необходимо устанавливать их как необходимые компоненты; см. в разделе как: Установка необходимых компонентов в дистрибутив приложения ClickOnce.

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

    Компонент COM можно изолировать только один раз для каждого приложения. Например, вы не можете изолировать один и тот же com-компонент от двух разных проектов библиотеки классов, которые являются частью одного приложения. Это приведет к предупреждению сборки, и приложению не удастся загрузить во время выполнения. Чтобы избежать этой проблемы, корпорация Майкрософт рекомендует инкапсулировать компоненты COM в одной библиотеке классов.

    Существует несколько сценариев, в которых требуется регистрация COM на компьютере разработчика, даже если развертывание приложения не требует регистрации. Свойство Isolated требует, чтобы компонент COM был зарегистрирован на компьютере разработчика для автоматического создания манифеста во время сборки. Во время сборки нет возможностей для записи регистрации. Кроме того, все классы, не определенные явным образом в библиотеке типов, не будут отражены в манифесте. При использовании COM-компонента с предварительно существующим манифестом, например собственной ссылкой, компонент может не быть зарегистрирован во время разработки. Однако регистрация требуется, если компонент является элементом ActiveX, и вы хотите включить его в панель элементов и конструктор Windows Forms.