Сборка идентификационных имен в манифестах SxS

У меня есть два вопроса относительно API активации контекста и манифестов SxS. Они выглядят очень просто, но я не могу найти для них хорошего ответа.

У меня есть две библиотеки DLL с именами файлов foo.dll и bar.dll, обе со встроенными манифестами, foo зависит от бара. Есть ли способ назначить эти два с именем AssemblyIdentity, кроме их имени файла? Например, если я хочу, чтобы идентификатор сборки bar.dll был CompanyName.Subsection.bar ? Если я изменяю его личность, как это — я получаю сообщение об ошибке при попытке загрузить foo.dll "Dependent Assembly CompanyName.Subsection.bar,type="win32",version="0.1.2.3" could not be found", Конечно, если я укажу имена сборок имен в качестве имен файлов (<assemblyIdentity name="bar") все работает, но есть ли способ использовать эти точечные имена?

foo.dll

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="foo" version="0.1.2.3" type="win32"/>
<dependency>
<dependentAssembly>
<assemblyIdentity name="CompanyName.Subsection.bar" version="0.1.2.3" type="win32" />
</dependentAssembly>
</dependency>
<file name="foo.dll">
</file>
</assembly>

bar.dll

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="CompanyName.Subsection.bar" version="0.1.2.3" type="win32"/>
<file name="bar.dll">
</file>
</assembly>

2

Решение

Это можно сделать, если вместо встраивания манифеста для bar.dll вы поместите его в отдельную папку вместе с самой dll. т.е .:

foo.dll
CompanyName.Subsection.bar/
├── bar.dll
└── CompanyName.Subsection.bar.manifest

Вам все еще нужно встроить первый манифест в foo.dll. Я уверен, что вы можете удалить следующий фрагмент из этого манифеста, потому что это встроенный манифест и, следовательно, не нужно указывать, какие dll принадлежат сборке:

<file name="foo.dll">
</file>

Манифест для bar.dll хорош, но обязательно назовите папку а также файл манифеста точно так, как указано в assemblyIdentity элемент (см. пример структуры папок выше).

Также обратите внимание, что вы можете диагностировать проблемы, связанные с загрузкой сборок SxS с помощью sxstrace инструмент командной строки. Пошаговые инструкции:

  1. Бежать sxstrace trace -logfile:mytrace.etl из командной строки Visual Studio. Команда не вернется, пока вы не нажмете ENTER. Однако пока не нажимайте ENTER.
  2. Запустите приложение, которое загружает foo.dll, чтобы воспроизвести вашу проблему
  3. Затем нажмите ENTER в окне командной строки, чтобы остановить sxstrace
  4. Теперь у вас есть файл mytrace.etl, который не предназначен для чтения человеком. Преобразуйте его в читаемый формат, запустив sxstrace parse -logfile:mytrace.etl -outfile:mytrace.txt, Вы получаете файл mytrace.txt, который показывает, что происходит, когда вы загружаете foo.dll и где он не может решить некоторые из его зависимостей.
1

Другие решения

Других решений пока нет …