Приватная параллельная сборка в 1 DLL - это то же самое, что и обычная DLL?

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

В документации говорится:

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

и

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

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

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

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


person Alex    schedule 23.01.2011    source источник


Ответы (2)


Использование частных сборок SxS для развертывания dll на самом деле просто сложный способ заставить что-то чаще выходить из строя.

Однако есть некоторые преимущества:

  • Сборки SxS более безопасны, поскольку поиск выполняется только в папке WinSxS и в папке EXE.
  • Сборки SxS необходимы для регистрации бесплатного COM. Это означает, что вы можете развернуть приложение с COM-объектом, объединенным как сборка SxS, который можно установить с помощью XCopy и без повышения прав.
  • Сборки SxS начинают становиться более мощными, когда вы понимаете, что МОЖЕТЕ использовать эту технологию для загрузки нескольких разных версий одной и той же Dll, даже если они установлены как частная сборка SxS. Обычно, когда загрузчик Windows загружает ваш EXE-файл и обрабатывает его манифест для создания контекста активации, он использует папку приложения в качестве базовой папки для поиска SxS.

Однако вы можете создавать свои собственные контексты активации во время выполнения, используя Activation Context API с указанными вами базовыми папками, в которых затем будет выполняться поиск частных сборок SxS. Вы можете использовать этот метод для динамической загрузки дополнительных сборок или различных версий сборок, чтобы при необходимости реализовать какой-либо плагин api.


Чтобы использовать API контекста активации, вам необходимо:

  • Поймите, что это нельзя использовать для статически привязанных ресурсов, поскольку они всегда загружаются в контексте, созданном загрузчиком ОС.

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

  • Заполните структуру ACTCTX с деталями того, где находится манифест, и убедитесь, что lpAssemblyDirectory указывает на каталог, содержащий определенную версию частной сборки SxS. Вызовите CreateActCtx, чтобы создать объект контекста активации.

  • Когда придет время загрузить определенную версию dll, активируйте соответствующий контекст активации с помощью ActivateActCtx, затем вызовите LoadLibrary для простого имени библиотеки. Деактивируйте его после вызова, поскольку с загруженной dll контекст активации больше не требуется, чтобы быть активным - до тех пор, пока вы не сделаете еще один вызов функции API, которая должна будет искать контекст активации - например, создать окно класса, размещенного в dll, или создать com-объект без регистрации.

При загрузке dll система будет искать в предоставленном lpAssemblyDirectory dll И любые зависимые сборки, которые она может иметь.

person Chris Becke    schedule 23.01.2011
comment
Вы можете объяснить, как можно архивировать пункт 3? Единственный способ - использовать API контекста активации вручную? Я не вижу способа сохранить две версии DLL как частную сборку. - person Alex; 24.01.2011
comment
Вы не можете хранить две версии dll как частную сборку в одном месте. Однако api контекста активации позволяет указать папку для поиска сборок. - person Chris Becke; 24.01.2011
comment
... сложный способ заставить вещи чаще выходить из строя ... - Цитата, пожалуйста. - person jww; 16.06.2019

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

person Hans Passant    schedule 23.01.2011
comment
Итак, чем сборка отличается от обычной DLL? Я тоже могу поместить DLL в папку приложения. Зачем мне для этого нужен манифест? - person Alex; 23.01.2011
comment
Не уверен, о чем вы спрашиваете. Вам нужен манифест, если DLL является COM-сервером. Другие библиотеки DLL (собственные и управляемые) можно просто найти, потому что Windows и CLR всегда просматривают каталог, из которого пришел EXE. (Ужасные) параллельные документы используют термин «сборка» как общий термин, что на практике означает DLL. - person Hans Passant; 23.01.2011
comment
Я говорю об этом (msdn.microsoft.com/ en-us / library / ff951638 (VS.85) .aspx): частные сборки должны сопровождаться манифестом сборки. - person Alex; 24.01.2011
comment
Да, это те ужасные документы, о которых я упоминал, изучил их досконально и заставил их работать только методом проб и ошибок. Программист Microsoft, стоящий за всем этим, - Цзюньфэн Чжан. У него есть блог, и вам придется прочитать все его сообщения, чтобы хоть наполовину понять, что на самом деле означают документы MSDN. Только поведение .NET (также известное как слияние) хорошо задокументировано, собственное поведение тонко и непостижимо отличается. c: \ windows \ winsxs - хорошая идея, но никто, кроме Microsoft, не использует его, потому что никто еще не понял, как это сделать. Другой вид адского DLL. - person Hans Passant; 24.01.2011