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

问题描述:

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

所以我有3倍的DLL:

  • 头本地C++ DLL取决于托管C++;
  • 托管C++依赖于C#;
  • 包含主逻辑的C#dll。

安装到用户目录全部3倍的DLL(C:\用户\\应用程序数据\漫游\ 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(母语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> 

试图链接依赖d使用#pragma指令LLS:

#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依赖关系,并确认托管C++和C#之间有什么相关性不存在。

插件可以访问head dll(Native C++),它也加载了Managed C++,但是当Managed C++调用C#dll - 插件失败时,C#程序集无法找到。

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

看起来像并排依赖不能在托管C++ & C#之间工作。

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

+0

您在FireBreath IRC会议室询问这个问题;不幸的是,由于我从来没有这样做,我根本不知道。不过,作为一个插件不会和任何其他应用程序有所不同,除了你只能修改加载另一个DLL的DLL,而不是应用程序本身。 – taxilian

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

你有没有考虑在C++本机代码和C#之间使用C++/CLI to provide a wrapper?如果您正在Visual Studio中的Windows上编译,则可以通过设置/ clr开关来创建C++ lib以允许混合管理/本机代码。然后,您可以直接从您的混合C++/CLI dll引用C#程序集并直接调用它。只要C#程序集在同一个目录中,它应该可以工作。

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

最好的问候,

+0

我有3个DLL - 本机C++,托管C++/CLI和C#。因此,我已经使用C++/CLI库作为托管/非托管代码之间的代理。 –

+0

@AndreyOsipov doh shucks。好吧,我刚刚提出了一些建议。 –

解决了它。

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