Поделиться через


Построение параллельных сборок C/C++

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

Приложение C++ может использовать одну или несколько библиотек DLL в разных частях приложения. Во время выполнения библиотеки DLL загружаются в главный процесс, и выполняется необходимый код. Приложение полагается на операционную систему, чтобы найти запрошенные библиотеки DLL, понять, какие другие зависимые библиотеки DLL должны быть загружены, а затем загрузить их вместе с запрошенной библиотекой DLL. В операционных системах Windows, предшествующих Windows XP, Windows Server 2003 и Windows Vista, загрузчик операционной системы выполняет поиск зависимых библиотек DLL либо в локальной папке приложения, либо в другой папке, указанной в системном пути. В Windows XP, Windows Server 2003 и Windows Vista загрузчик операционной системы также может искать зависимые библиотеки DLL с помощью файла манифеста и выполнять поиск параллельных сборок, содержащих эти библиотеки DLL.

По умолчанию при построении библиотеки DLL с помощью Visual Studio она имеет манифест приложения, внедренный как ресурс RT_MANIFEST с идентификатором, равным 2. Как и для исполняемого файла, этот манифест описывает зависимости этой библиотеки DLL от других сборок. Предполагается, что библиотека DLL не является частью параллельной сборки, и приложения, зависящие от этой библиотеки DLL, не будут использовать манифест приложения для его загрузки, а вместо этого зависят от загрузчика операционной системы, чтобы найти эту библиотеку DLL по системному пути.

Примечание.

Для библиотеки DLL, использующей манифест приложения, важно, чтобы манифест был внедрен как ресурс с идентификатором, равным 2. Если библиотека DLL динамически загружается во время выполнения (например, с помощью функции LoadLibrary), загрузчик операционной системы загружает зависимые сборки, указанные в манифесте библиотеки DLL. Во время вызова LoadLibrary внешний манифест приложения для библиотек DLL не проверяется. Если манифест не внедрен, загрузчик может попытаться загрузить неверные версии сборок или ему не удастся найти зависимые сборки.

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

Примечание.

Если сборка содержит одну библиотеку DLL, рекомендуется внедрить манифест сборки в эту библиотеку DLL как ресурс с идентификатором, равным 1, и присвоить закрытой сборке имя, совпадающее с именем библиотеки DLL. Например, если имя библиотеки DLL — mylibrary.dll, значение атрибута имени, используемого в <элементе assemblyIdentity> манифеста, также может быть mylibrary. В некоторых случаях, если библиотека имеет расширение, отличное от DLL (например, проект элементов управления ActiveX MFC создает OCX-библиотеку), можно создать манифест внешней сборки. В этом случае имена сборки и ее манифеста должны отличаться от имени библиотеки DLL (например, MyAssembly, MyAssembly.manifest и MyLibrary.ocx). Однако рекомендуется переименовать такие библиотеки, чтобы они имели расширение DLL, и внедрить манифест в качестве ресурса, чтобы упростить обслуживание этой сборки. Дополнительные сведения о порядке поиска закрытых сборок операционной системой см. в разделе Порядок поиска сборок.

Это изменение может разрешить развертывание соответствующих библиотек DLL в качестве закрытой сборки в локальной папке приложения или в качестве общей сборки в кэше сборок WinSxS. Чтобы обеспечить правильное поведение среды выполнения этой новой сборки, необходимо выполнить несколько шагов. Они описаны в рекомендациях по созданию параллельных сборок. После правильной разработки сборки ее можно развернуть как общую или частную сборку вместе с приложением, которое зависит от нее. При установке параллельных сборок в качестве общей сборки можно либо следовать рекомендациям, описанным в разделе Установка сборок Win32 для параллельного совместного использования в Windows XP, либо использовать модули слияния. При установке параллельных сборок в качестве закрытой сборки можно просто скопировать соответствующую библиотеку DLL, ресурсы и манифест сборки как часть процесса установки в локальную папку приложения на целевом компьютере так, чтобы загрузчик нашел эту сборку во время выполнения (см. раздел Порядок поиска сборок). Другим способом является использование установщика Windows и соблюдение рекомендаций, описанных в разделе Установка сборок Win32 для частного использования приложения в Windows XP.

См. также

Создание изолированных приложений на C/C++
Создание изолированных приложений и параллельных сборок C/C++