Использование частных сборок SxS для развертывания библиотек DLL на самом деле является просто сложным способом частого сбоя.
Однако есть некоторые преимущества:
- Сборки SxS более безопасны,при этом будет осуществляться поиск только в папке WinSxS и папке EXE.
- Сборки SxS необходимы для регистрации свободного COM.Это означает, что вы можете развернуть приложение с COM-объектом, связанным как сборка SxS, которое можно установить через XCopy и без повышения прав.
- Сборки SxS начинают становиться все более мощными, когда вы понимаете, что можете МОЖЕТ использовать эту технологию длязагрузить несколько разных версий одного и того же Dll, даже если он установлен как частная сборка SxS.В обычном ходе событий, когда загрузчик Windows загружает ваш EXE-файл и обрабатывает его манифест для создания контекста активации, он использует папку приложения в качестве базовой папки для поиска SxS.
Однако вы можетесоздайте свои собственные контексты активации во время выполнения, используя API-интерфейс активации с указанными вами базовыми папками, которые затем будут искать частные сборки SxS.Вы можете использовать этот метод для динамической загрузки дополнительных сборок или различных версий сборок для реализации какого-либо API-интерфейса подключаемого модуля при необходимости.
Чтобы использовать API-интерфейс активации, необходимо:
Поймите, что это нельзя использовать для статически связанных ресурсов, так как они всегда загружаются в контексте, сгенерированном загрузчиком ОС.
создайте некоторые файлы манифеста приложения, описывающиезависимые сборки, которые вы хотите при желании загрузить, которые вы отправляете вместе с вашим приложением - извне или в виде ресурсов RT_MANIFEST с идентификаторами ресурса> 16.
Заполните структуру ACTCTX сведения о том, где находится манифест, и убедитесь, что lpAssemblyDirectory указывает на каталог, содержащий конкретную версию частной сборки SxS.Вызовите CreateActCtx для создания объекта контекста активации.
Когда придет время загрузить определенную версию библиотеки DLL, активируйте соответствующий контекст активации с помощью ActivateActCtx , а затем вызовитеLoadLibrary на простое имя библиотеки DLL.Деактивируйте его после вызова, так как при загруженной dll контекст активации больше не требуется быть активным - до тех пор, пока вы не сделаете еще один вызов функции API, которая должна будет выполнить поиск в контексте активации - например, создать окно классаразмещенный в dll, или создайте бесплатный com объект для регистрации.
Система при загрузке dll выполнит поиск в предоставленной lpAssemblyDirectory для dll и любых зависимых сборок, которые у нее могут быть.