Зависимость между 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#, я бы не советовал делать это, но это кое-что, чтобы рассмотреть на будущее.

С наилучшими пожеланиями,

Другие вопросы по тегам