Хорошо, вам нужно настроить его так:
c:\apppath\testapp.exe
- exe-файл вашего тестового приложения
c:\apppath\testapp.exe.manifest
- потенциально встроенный файл манифеста приложения
c:\apppath\EmptyAssm\EmptyAssm.manifest
- Манифест, описывающий вашу новую сборку.
c:\apppath\EmptyAssm\empty.dll
- сборка dll
c:\apppath\EmptyAssm\empty.dll.2.manifest
- встроенный манифест в dll
Итак, у вас есть тестовое приложение, которое содержит манифест приложения: который содержит ссылки на зависимые сборки для приложения, включая тот, который вы добавляете в свою пользовательскую сборку dll.
В папке приложения assm папки приложения есть манифест сборки сборки "EmptyAssm", который содержит файловый узел, ссылающийся на фактическую dll, "empty.dll".
empty.dll встраивает свой собственный манифест, содержащий ссылки на зависимые сборки для любых открытых или закрытых сборок, которые ему требуются.
Это важный момент: манифест сборки «EmptyAssm» и «пустые» манифесты dll потенциально различны. Файл манифеста сборки ("EmptyAssm") НЕ ДОЛЖЕН быть внедрен, но может иметь общее имя манифеста dll, если вы решите назвать свой манифест именем dll.
Теперь, когда загрузчик загружает ваш EXE-файл, он загружает манифест вашего EXE-файла и добавляет его в контекст активации. Когда таблица импорта EXE обрабатывается, ИЛИ вы вызываете LoadLibrary, загрузчик сначала ищет в контексте активации манифест сборки с соответствующим файловым узлом. Если он находит соответствующую сборку, ТОГДА он обрабатывает и загружает dll из места сборки (папка, содержащая сборки .manifest), и он может в это время, если в dll нет встроенного манифеста, а dll и манифест имеют с тем же именем, повторно используйте тот же файл манифеста для настройки контекста активации DLL.
Если вы хотите поместить манифест «emptyassm» и dll в другую папку, в папку вашего приложения, И ЕСЛИ вы нацеливаетесь на Windows Server 2008, Windows 7 или более позднюю версию, вы можете добавить файл конфигурации для вашего приложение: -
c:\apppath\testapp.exe.config
- файл конфигурации приложения
Файл конфигурации приложения может содержать пробный узел в узле assemblyBinding
(файлы конфигурации очень похожи на файлы манифеста) с privatePath="some relative path"
. В этом случае в соответствующей папке будет выполнен поиск сборок.
Мой последний ответ здесь содержит примеры файлов, описывающих процесс создания сборки из dll и ссылки на нее из exe: -
Способ загрузки DLL из центрального хранилища
Просто чтобы уточнить:
Сборка win32 - это (в самом простом) файл манифеста, описывающий сборку, и dll.
В этой модели они всегда находятся в одной и той же папке, поэтому файловый узел манифеста вообще не может содержать никакой информации о пути - только имя dll.
Сборками можно поделиться - предоставив им надежную версию (и немного цифровой подписи) и установив их в Windows \ WinSxS или в приватную.
Версии Windows до 5.1 (Win XP) вообще не будут искать сборки, так как эта технология была добавлена только в XP.
Windows 5.1 - 6.0 (XP и Vista) будут искать только частные сборки в папке объекта с активным контекстом активации: - Если exe ссылается на сборку, то папка, содержащая exe. Если код в dll ссылается на сборку, то выполняется поиск в папке dll.
Если вы хотите хранить свою dll в приватном месте, которое используется несколькими приложениями (например), вы ДОЛЖНЫ иметь требование Windows 7 или более поздней версии: -
Windows версии 6.1 (также известная как Windows Server 2008 или Windows 7) и более поздние версии дополнительно к папке модуля будут искать путь, указанный в качестве элемента privatePath элемента исследования в файле конфигурации приложения.
Файлы конфигурации приложения всегда находятся в той же папке, что и exe или dll, и имеют имя:
<exename>.exe.config
или <dllname>.dll.2.config
(Причина .2. В том, что потенциально много встроенных манифестов и конфигураций в виде ресурсов, и загрузчик резервирует идентификаторы ресурсов в 1 ... 15. При поиске на диске манифеста файла конфигурации, если ресурсидентификатор встроенного ресурса был бы равен 1, идентификатор опущен, но любое другое число означает, что оно становится частью имени файла).