Зависимость между C ++ и C # - PullRequest
4 голосов
/ 23 января 2012

Я делаю плагин для браузера, используя 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 #.

Как я могу загрузить зависимые библиотеки для моего плагина?

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Решено.

Добавлен обработчик ResolveEventHandler в сборку прокси C ++ / CLI, которая загружает сборку C # из пользовательского каталога.

0 голосов
/ 23 января 2012

Боюсь, я ничего не знаю о Firebreath или манифесте зависимости сборки, но есть потенциальный обходной путь для вас.

Рассматривали ли вы возможность использования C ++ / CLI для создания оболочки между собственным кодом C ++ и C #?Если вы компилируете в Windows в VisualStudio, можно создать библиотеку C ++, чтобы разрешить смешанный управляемый / собственный код, просто установив ключ / clr.Затем вы можете ссылаться на сборку C # непосредственно из вашей смешанной DLL C ++ / CLI и вызывать ее напрямую.Пока сборка C # находится в том же каталоге, она должна работать.

Фактически, вы можете пойти еще дальше и определить всю сборку как смешанную C ++ / CLI - импортировать все управляемые элементы в эту DLL.Если у вас уже есть обширный код на C #, я бы не советовал делать это, но это то, что нужно учитывать в будущем.

С уважением,

...