Зависимость между C++ и C#
Я делаю плагин для браузера, используя FireBreath Framework. Большая часть логики написана на C#, и для вызова из браузера я сделал оболочку C++. Браузеры вызывают собственный код C++, который вызывает "прокси". Управляемый код C++, который вызывает реальную логику в проекте C#.
Итак, у меня есть 3 dll:
- Голова родной 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#.
Как я могу загрузить зависимые библиотеки для моего плагина?
2 ответа
Решил это.
Добавлен обработчик ResolveEventHandler в сборку прокси C++/CLI, которая загружает сборку C# из пользовательского каталога.
Боюсь, я ничего не знаю о Firebreath или манифесте зависимости сборки, но есть потенциальный обходной путь для вас.
Рассматривали ли вы использование C++/CLI для создания оболочки между собственным кодом C++ и C#? Если вы компилируете в Windows в VisualStudio, можно создать библиотеку C++, чтобы разрешить смешанный управляемый / собственный код, просто установив ключ / clr. Затем вы можете ссылаться на сборку C# напрямую из вашей смешанной DLL C++/CLI и вызывать ее напрямую. Пока сборка C# находится в том же каталоге, она должна работать.
Фактически, вы можете пойти еще дальше и определить всю сборку как смешанную C++/CLI - импортировать все управляемые элементы в эту DLL. Если у вас уже есть обширный код на C#, я бы не советовал делать это, но это кое-что, чтобы рассмотреть на будущее.
С наилучшими пожеланиями,