Я делаю плагин для браузера, используя FireBreath Framework. Большая часть логики написана на C #, и для вызова из браузера я сделал оболочку C ++. Браузеры вызывают собственный код C ++, который вызывает «прокси». Управляемый код C ++, который вызывает реальную логику в проекте C #.
Итак, у меня есть 3 библиотеки:
- Головная нативная C ++ dll, которая зависит от Managed C ++;
- Управляемый C ++, который зависит от C #;
- C # dll, которая содержит основную логику.
Все 3 библиотеки установлены в пользовательский каталог (c: \ Users \\ AppData \ Roaming \ MyCompany \ MyApp \ 1.0.0.0)
Проблема в том, что браузер не загружает C # dll. Я использую Side by Side манифест для объявления зависимостей.
Я попытался создать отдельный файл манифеста для объявления сборки:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity name="MyAssembly" processorArchitecture="*" type="win32" version="1.0.0.0"/>
<file name="FirstDependency.dll"/>
<file name="SecondDependency.dll"/>
</assembly>
и добавил ссылку на эту зависимость для заголовка dll (Native C ++):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity name="MyAssembly" processorArchitecture="*" type="win32" version="1.0.0.0"/>
</dependentAssembly>
</dependency>
</assembly>
Также я попытался объявить зависимость прямо в голове dll (Native C ++):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="FirstDependency.dll"/>
<file name="SecondDependency.dll"/>
</assembly>
Попытка связать зависимые библиотеки с помощью директивы #pragma:
#pragma comment(linker, "\"/manifestdependency:type='win32' name='FirstDependency' version='1.0.0.0' processorArchitecture='X86' language='*'\"")
#pragma comment(linker, "\"/manifestdependency:type='win32' name='SecondDependency' version='1.0.0.0' processorArchitecture='X86' language='*'\"")
Я проверил зависимости с помощью Dependency Walker, и он подтвердил, что зависимости между Managed C ++ и C # не существует.
Плагин имеет доступ к головному dll (Native C ++) и также загружает Managed C ++, НО, когда Managed C ++ вызывает C # dll - плагин не работает, сборка C # не может быть найдена.
Если я помещаю C # dll в один каталог с приложением браузера (firefox.exe или chrome.exe) - это работает.
Похоже, что параллельная зависимость не работает между Managed C ++ и C #.
Как я могу загрузить зависимые библиотеки для моего плагина?