Имена удостоверений сборки в манифестах SxS

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

У меня есть две библиотеки dll с именами файлов foo.dll и bar.dll, обе со встроенными манифестами, foo зависит от bar. Есть ли способ присвоить этим двум имя 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> 

person Ibraim Ganiev    schedule 27.02.2018    source источник


Ответы (1)


Это можно сделать, если вместо встраивания манифеста для 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, и где не удается разрешить некоторые из его зависимостей.
person Alexander Tobias Bockstaller    schedule 06.09.2018