托管C dll调用C#dll,FileNotFoundException

时间:2013-02-23 04:04:44

标签: c# c++ dll unmanaged managed

我的应用程序环境本质上是一个插件,其中包含:

主机应用程序调用非托管c ++ dll调用托管C ++ dll调用C#dll

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

所以,问题是如何在托管C ++ dll加载时以非编程方式C ++代码以编程方式设置C#dll的加载目录?我已经尝试了SetDllDirectory并在系统上设置路径变量,但我的dll所在的目录没有成功。

1 个答案:

答案 0 :(得分:1)

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

如果EXE不是你的,并且没有完全解决将东西放在EXE目录之外的目标,这往往是不明智的。 GAC是一个简单的解决方法。