C ++和C#之间的并排依赖

时间:2012-01-23 08:04:07

标签: c# c++ npapi firebreath sxs

我正在使用FireBreath框架制作浏览器插件。大多数逻辑是用C#编写的,并且从浏览器调用它我已经制作了一个C ++包装器。浏览器调用C ++ Native代码,该代码调用“代理”托管C ++代码,该代码在C#项目中调用实际逻辑。

所以我有3个dll:

  • 头部本机C ++ DLL,它依赖于托管C ++;
  • 托管C ++,它依赖于C#;
  • 包含主要逻辑的C#dll。

所有3个dll都安装到用户目录(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> 

并将此依赖项的链接添加到head 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>

此外,我尝试直接在head 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 directive链接依赖dll:

 #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 ++)并且它也可以加载托管C ++但是当托管C ++调用C#dll时 - 插件失败,无法找到C#程序集。

如果我将C#dll与浏览器应用程序(firefox.exe或chrome.exe)放在同一目录中 - 它可以正常工作。

在托管C ++和&amp ;;之间看起来并排依赖不起作用。 C#。

如何为插件加载依赖dll?

2 个答案:

答案 0 :(得分:2)

解决了它。

将ResolveEventHandler处理程序添加到C ++ / CLI代理程序集中,该程序集从用户目录加载C#程序集。

答案 1 :(得分:0)

我担心我对Firebreath或程序集依赖性清单一无所知,但有一个潜在的解决方法。

您是否考虑在C ++本机代码和C#之间使用C++/CLI to provide a wrapper?如果您在VisualStudio中的Windows上进行编译,则可以通过设置/ clr开关使C ++库允许混合的托管/本机代码。然后,您可以直接从混合C ++ / CLI dll引用C#程序集并直接调用它。只要C#程序集位于同一目录中,它应该可以工作。

实际上,您可以进一步将整个程序集定义为混合C ++ / CLI - 将所有托管元素导入此DLL。如果您已经在C#中拥有大量代码,我不会建议这样做,但这是未来需要考虑的事情。

致以最诚挚的问候,