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?
恐怕我对Firebreath或程序集依赖关系清单一无所知,但对您有潜在的解决方法。
你有没有考虑在C++本机代码和C#之间使用C++/CLI to provide a wrapper?如果您正在Visual Studio中的Windows上编译,则可以通过设置/ clr开关来创建C++ lib以允许混合管理/本机代码。然后,您可以直接从您的混合C++/CLI dll引用C#程序集并直接调用它。只要C#程序集在同一个目录中,它应该可以工作。
实际上,您可以进一步将整个程序集定义为混合C++/CLI - 将所有托管元素导入到此DLL中。如果你已经在C#中有广泛的代码,我不会建议这样做,但这是未来需要考虑的事情。
最好的问候,
我有3个DLL - 本机C++,托管C++/CLI和C#。因此,我已经使用C++/CLI库作为托管/非托管代码之间的代理。 –
@AndreyOsipov doh shucks。好吧,我刚刚提出了一些建议。 –
解决了它。
将ResolveEventHandler处理程序添加到从用户目录加载C#程序集的C++/CLI代理程序集。
您在FireBreath IRC会议室询问这个问题;不幸的是,由于我从来没有这样做,我根本不知道。不过,作为一个插件不会和任何其他应用程序有所不同,除了你只能修改加载另一个DLL的DLL,而不是应用程序本身。 – taxilian