我正在使用FireBreath框架制作浏览器插件。大多数逻辑是用C#编写的,并且从浏览器调用它我已经制作了一个C ++包装器。浏览器调用C ++ Native代码,该代码调用“代理”托管C ++代码,该代码在C#项目中调用实际逻辑。
所以我有3个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?
答案 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#中拥有大量代码,我不会建议这样做,但这是未来需要考虑的事情。
致以最诚挚的问候,