从本机代码调用的C ++ / CLI库加载其他.NET库

时间:2013-04-19 16:51:32

标签: .net c++-cli assembly-resolution

所以我有三个部分:

  • Lib:为AnyCPU编译的C#库。
  • BridgeLib:为x86编译的C ++ / CLI库。它导出一个名为bridgeEntry的本机C函数,并调用Lib中的方法。
  • NativeExe:一个本机C ++ Win32应用程序,只需加载BridgeLib.dll并执行bridgeEntry

现在我把它们全部放到一个目录中,正如预期的那样,当我运行NativeExe时会执行Lib的代码。

但是,如果我重新安排目录结构如下:

├───exe
│       NativeExe.exe
│
└───libs
        BridgeLib.dll
        Lib.dll
事情有点不同。显然,NativeExe.exe文件夹中的exe运行失败,因为它找不到BridgeLib.dll。但是,可以通过转到libs文件夹并运行..\exe\NativeExe.exe来解决这个问题。现在,应用程序加载BridgeLib.dll并跳转到bridgeEntry。但是现在CLR与FileNotFoundException崩溃了,因为它在可执行文件夹(Lib.dll)中找不到exe而在桥库的文件夹libs中找不到。

这只是一个过于简化的示例,我无法更改目录结构。但我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:2)

您的C ++ / CLI库可以处理AppDomain.AssemblyResolve以正确指定C#程序集的位置。 CLR在运行时无法找到程序集时会触发此事件,并为您提供自行加载程序集的机会。