C++和C#之间的并行依赖关系

Side by Side dependency between C++ and C#

本文关键字:并行 依赖 关系 之间 C++      更新时间:2023-10-16

我正在使用FireBreath Framework制作一个浏览器插件。大部分逻辑都是在C#上编写的,为了从浏览器中调用它,我制作了一个C++包装器。浏览器调用C++本机代码,该代码调用"代理"托管C++代码,该托管C++代码调用C#项目中的实际逻辑。

所以我有3个dll:

  • 负责依赖托管C++的原生C++dll
  • 托管C++,它依赖于C#
  • 包含主逻辑的C#dll

安装到用户目录(c:\Users\\AppData\Roaming\MyCompany\MyApp\1.0.0.0)的所有3个dll

问题是浏览器没有加载C#dll。我使用并排清单来声明依赖项。

我试图制作一个单独的清单文件来声明程序集:

<?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>

此外,我还试图直接在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指令链接依赖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='*'"")

我使用DependencyWalker检查了依赖关系,它确认了托管C++和C#之间不存在什么依赖关系。

插件可以访问头dll(本机C++),它也加载托管C++,但当托管C++调用C#dll时,插件失败,找不到C#程序集。

如果我把C#dll和浏览器应用程序(firefox.exe或chrome.exe)放在同一个目录中,它就可以工作了。

看起来在托管C++和amp;C#。

如何为我的插件加载依赖的dll?

解决了它。

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

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

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

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

致问候,