Частная параллельная сборка в 1 DLL - это то же самое, что и обычная DLL? - PullRequest
0 голосов
/ 23 января 2011

Я смотрю на параллельные сборки и изолированное решение для приложений в Microsoft Windows.

Документация гласит:

Частная сборка - это сборка, которая развернут с приложением и является доступны для эксклюзивного использования это приложение.

и

Частные собрания должны быть рассчитаны на работать бок о бок с другими версиями сборки в системе.

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

Может кто-нибудь объяснить мне это?

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

Ответы [ 2 ]

3 голосов
/ 23 января 2011

Использование частных сборок 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 и любых зависимых сборок, которые у нее могут быть.

1 голос
/ 23 января 2011

Ну, каждый EXE будет иметь свою собственную частную DLL.Здесь нет необходимости перезаписывать, вы поместите каждый EXE-файл в отдельную директорию установки.Они могут иметь разные версии DLL по своему дизайну, DLL Hell не существует.Кроме того, эти DLL могут касаться других частей файловой системы или реестра и наступать друг на друга, делая это.Ссылка на «должна быть разработана, чтобы работать бок о бок».Этого редко бывает трудно достичь.

...