C++和C#之间的并行依赖关系
Side by Side dependency between C++ and C#
我正在使用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#中有了大量的代码,我不建议你这样做,但这是未来需要考虑的问题。
致问候,
- 如何从C++中的依赖类型中获得它所依赖的类型
- C++17中的并行执行策略
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 并行用于C++17中数组索引范围内的循环
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 如何在Elixir中调用递归函数并行
- OpenMP:并行更新数组总是需要减少数组吗
- C++GTKMM gui循环依赖关系
- 通过ccmake在cmake中缓存依赖选项
- 如何使用OpenMP并行这两个循环
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 激活上下文生成失败,依赖程序集,并行,事件 ID 33
- 在Visual Studio中相互依赖的项目的并行汇编
- 如何在C++中管理并行的依赖继承
- 使用依赖项并行运行多个任务
- C++和C#之间的并行依赖关系
- 为依赖于先前值的矩阵运行并行代码
- Microsoft Visual Studio 2008正在并行地构建依赖于它们所依赖的项目
- CUDA 并行化依赖的 2D 阵列