У меня есть два вопроса относительно 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>
Это можно сделать, если вместо встраивания манифеста для 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 инструмент командной строки. Пошаговые инструкции:
sxstrace trace -logfile:mytrace.etl
из командной строки Visual Studio. Команда не вернется, пока вы не нажмете ENTER. Однако пока не нажимайте ENTER.sxstrace parse -logfile:mytrace.etl -outfile:mytrace.txt
, Вы получаете файл mytrace.txt, который показывает, что происходит, когда вы загружаете foo.dll и где он не может решить некоторые из его зависимостей.Других решений пока нет …