托管的C dll调用C#dll,FileNotFoundException

Managed C dll calling C# dll, FileNotFoundException

本文关键字:C#dll FileNotFoundException 调用 dll      更新时间:2023-10-16

我有一个应用程序环境,它本质上是一个插件,其中:

主机应用程序调用非托管c++dll,该dll调用托管c++dll并调用c#dll

这是一种通过使用托管C++的桥接从未托管C++调用C#的方法。这一切在大多数情况下都能很好地工作,除了在插件类型体系结构中,我的dll(非托管C++、托管C++和C#)与调用dll的应用程序不在同一目录中。当应用程序调用非托管C++时,一切都很好,因为应用程序知道要调用哪个目录来加载dll。然而,当非托管C++第一次调用托管C++时,我们会得到一个FileNotFoundException。事实证明,它没有找到C#dll(注意,所有三个dll都在同一目录中,只是不在应用程序目录中)。如果我把所有的dll都放在exe的运行时目录中,那么一切都很正常,我们不会得到FileNotFoundException。但是当我部署时,我将无法控制调用的应用程序,因此无法将我的dll放在运行时目录中。

因此,问题是,当托管C++dll加载时,我如何在非托管C++代码中以编程方式设置C#dll的加载目录?我尝试过SetDllDirectory,并将系统上的路径变量设置为我的dll所在的目录无效。

CLR默认情况下只在两个位置查找程序集:GAC第一个,EXE启动的目录第二个。让它去别处寻找需要额外的工作。一种可能性是,您无法为AppDomain订阅事件处理程序。AssemblyResolve在此方案中。这会留下一个包含<probing><codebase>元素的app.exe.config文件。您必须将其命名为与非托管EXE相同的名称,并将其存储在与EXE相同的文件夹中。

如果EXE不是您的,并且没有完全解决将内容排除在EXE目录之外的目标,那么这往往是不明智的。GAC是一个简单的解决方法。