Есть такая проблема: есть сборки, сделанные другим производителем, так получилось, что разработчик не позаботился о Dll-Hell и не прописал сертификаты к своим сборкам. Меня настигла эта проблема. Как выход, появилась идея прописать всем сборкам сертификаты собственноручно.
Пишу сертификат для сборки Lib1.dll, которая должна использовать сборку Lib2.dll
Ошибка при создании контекста активации для "C:\Program Files (x86)\Prod\Lib1.dll". Не найдена зависимая сборка "Man.Prod.Lib2,type="win32",version="1.75.181.0"". Используйте sxstrace.exe для подробной диагностики.
sxstrace.exe — не помогает.
Библиотеки лежат в одной папке.
Без <dependency> все регистрируется замечательно.
Регистрирую Lib1.dll, так как по другому ее просто не добавить в проект.
в WinSxS ни одна библиотека не прописана, не уверен, что это нужно...
По крайней мере это затруднительно, ввиду того, что нужно подписывать библиотеки, а подписать com библиотеки у меня пока не получилось.. это не так уж и просто..
Возможно такое, что в сертификате не прописаны COM классы ? Их там туча просто.
Обязательно ли в сертификате прописывать все COM классы ? Как я понял отсюда есть только 2 обязательных элемента, это — assembly и assemblyIdentity.
Тогда в чем проблема ?
Кто-нибудь, кто делал WinSxS сертификаты или хотя бы писал для COM помогите, поделитесь опытом, а то я уже совсем, честно говоря, запутался.
Re: Dll-Hell создание своего Assembly Manifest на внешнюю сборку.
Здравствуйте, Artemoniks, Вы писали:
A>Есть такая проблема: есть сборки, сделанные другим производителем, так получилось, что разработчик не позаботился о Dll-Hell и не прописал сертификаты к своим сборкам. Меня настигла эта проблема. Как выход, появилась идея прописать всем сборкам сертификаты собственноручно. A>Пишу сертификат для сборки Lib1.dll, которая должна использовать сборку Lib2.dll
A>...
A>пытаюсь зарегистрировать Lib1.dll A>regsvr32 Lib1.dll
A>Получаю ошибку:
A>...
A>sxstrace.exe — не помогает.
A>в WinSxS ни одна библиотека не прописана, не уверен, что это нужно... A>По крайней мере это затруднительно, ввиду того, что нужно подписывать библиотеки, а подписать com библиотеки у меня пока не получилось.. это не так уж и просто..
A>Возможно такое, что в сертификате не прописаны COM классы ? Их там туча просто. A>Обязательно ли в сертификате прописывать все COM классы ?
Ой, как все напутано !
Во-первых, не сертификаты, а манифесты. Во-вторых, regsvr32.exe звать не нужно.
В-третьих, никакие библиотеки подписывать не требуется, если только Вы не собираетесь
ставить сборки в системное хранилище (WinSxS).
Все несколько проще, попробую доступно описать.
Приложение A зависит от сборки B.
Чтобы выразить эту зависимость в терминах Side-By-Size (SxS), требуется создать
манифест приложения A со ссылкой на сборку B и манифест сборки B.
После этого сложить все файлы приложения, сборки и их манифесты в единую файловую структуру,
организованную по определенным правилам (более подробно — ищите в MSDN, там это все есть).
Если приложение лежит в папке верхнего уровня, то зависимые сборки и их манифесты должны
находиться в подпапках с одноименными названиями. Например (обратить внимание на имена
манифестов и подпапок — они должны в точности соответствовать именам сборок, не файлов):
myapp/
app.exe (файл, использующий сборку assembly.dll по имени Company.Product.Component)
app.exe.manifest (манифест приложения, может быть в ресурсах app.exe)
Company.Product.Component/
assembly.dll (сборка)
Company.Product.Component.manifest (манифест сборки)
Когда разберетесь с этими базовыми вещами, добавляйте в манифест сборки информацию о COM, как
описано в соответствующих статьях MSDN. В результате должен получится registration-free COM-сервер,
который будет использоваться приложением по строго зафиксированному номеру версии и без необходимости
вызова regsvr32.exe.
Re: Dll-Hell создание своего Assembly Manifest на внешнюю сборку.
<!--Сертификат для сборки Lib1.dll, которая должна использовать сборку Lib2.dll-->
<?xml version="1.0"encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:s chemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"name="Lib1"version="1.93.181.0"
/>
<file name="Lib2.dll"></file>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"name="Lib2"version="1.75.181.0"
/>
</dependentAssembly>
</dependency>
</assembly>
<!--Сертификат для Lib2.dll:-->
<?xml version="1.0"encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:s chemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"name="Lib2"version="1.75.181.0"
/>
</assembly>
Теперь при загрузке dll, уже в моей программе вылетает очень много сообщение типа: Module has already been loaded и кнопка OK, в заголовке сообщения названия модуля, что то типо Modul1
Причем Modul1 — нет таких файлов, следовательно эти модули содержатся внутри dll ? Как узнать какие модули загружает COM dll, какие модули входят в нее ? я лично думал, что модуль это — dll... Как избавиться от сообщения ? Можно ли как то запретить системе выдавать сообщения ? Их выдается около 30 штук... но и загружаю я около 4 dll.
Re[2]: Dll-Hell создание своего Assembly Manifest на внешнюю сборку.
<q> O>Ой, как все напутано ! O>Во-первых, не сертификаты, а манифесты. Во-вторых, regsvr32.exe звать не нужно. O>В-третьих, никакие библиотеки подписывать не требуется, если только Вы не собираетесь O>ставить сборки в системное хранилище (WinSxS).
</q>
Да, извиняюсь, не так назвал, сертификаты вместо правильного манифесты... видимо закружился малость...
Да, теперь понял, что в WinSxS не обязательно их класть... работает и так прекрасно...
regsvr32.exe все таки, мне кажется, нужен, так как я не могу добавить ссылку на сборку просто через Browse, ругается на неправильный формат... честно говоря, не знаю почему, видимо нужна обертка Interop.Lib1.dll, а просто так COM dll не добавишь в проект...
Но сейчас дело не в этом, с этим вроде все разобрался... манифесты, к стати у меня встроенные в dll.
Сейчас проблема в другом: много сообщений Module has already been loaded, описал в посте выше...