Dll-Hell создание своего Assembly Manifest на внешнюю сборку.
От: Artemoniks  
Дата: 26.11.12 11:40
Оценка:
Есть такая проблема: есть сборки, сделанные другим производителем, так получилось, что разработчик не позаботился о Dll-Hell и не прописал сертификаты к своим сборкам. Меня настигла эта проблема. Как выход, появилась идея прописать всем сборкам сертификаты собственноручно.
Пишу сертификат для сборки 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="Man.Prod.Lib1"
version="1.93.181.0"
processorArchitecture="x86"
/>

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

<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Man.Prod.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="Man.Prod.Lib2"
version="1.75.181.0"
processorArchitecture="x86"
/>
</assembly>


пытаюсь зарегистрировать Lib1.dll
regsvr32 Lib1.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 на внешнюю сборку.
От: okman Беларусь https://searchinform.ru/
Дата: 26.11.12 12:34
Оценка: 7 (1)
Здравствуйте, 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 на внешнюю сборку.
От: Artemoniks  
Дата: 26.11.12 14:41
Оценка:
Частично вопрос решил... нужно писать так:

<!--Сертификат для сборки 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 на внешнюю сборку.
От: Artemoniks  
Дата: 26.11.12 14:56
Оценка:
Здравствуйте, okman, Вы писали:

<q>
O>Ой, как все напутано !
O>Во-первых, не сертификаты, а манифесты. Во-вторых, regsvr32.exe звать не нужно.
O>В-третьих, никакие библиотеки подписывать не требуется, если только Вы не собираетесь
O>ставить сборки в системное хранилище (WinSxS).
</q>

Да, извиняюсь, не так назвал, сертификаты вместо правильного манифесты... видимо закружился малость...
Да, теперь понял, что в WinSxS не обязательно их класть... работает и так прекрасно...
regsvr32.exe все таки, мне кажется, нужен, так как я не могу добавить ссылку на сборку просто через Browse, ругается на неправильный формат... честно говоря, не знаю почему, видимо нужна обертка Interop.Lib1.dll, а просто так COM dll не добавишь в проект...

Но сейчас дело не в этом, с этим вроде все разобрался... манифесты, к стати у меня встроенные в dll.

Сейчас проблема в другом: много сообщений Module has already been loaded, описал в посте выше...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.