2013-02-23 102 views
0

我有一个应用程序环境,基本上是在一个插件:托管C DLL调用C#DLL,FileNotFoundException异常

主机应用程序调用非托管C++ 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所在的目录没有成功。

+0

你能发表一些代码吗?你使用的API是什么引发异常? – 2013-02-23 04:09:51

回答

1

对于程序集,默认情况下,CLR仅默认查找两个位置:GAC第一个,EXE从其开始的目录第二个。让它看看别处需要额外的工作。一种可能性是在表外,在这种情况下,您无法订阅AppDomain.AssemblyResolve的事件处理程序。使用<probing><codebase>元素留下一个app.exe.config文件。您必须将其与非托管EXE同名,并将其与EXE存储在相同的文件夹中。

如果EXE不是你的,那么这样做往往是不明智的,并且不能完全解决将东西放在EXE目录外的目标。 GAC是一种简单的解决方法。