托管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所在的目录没有成功。
默认情况下,CLR仅查找两个位置的程序集:GAC第一个,EXE从其开始的目录第二个。 让它看看别处需要额外的工作。 一种可能性是在表外,在这种情况下,您无法订阅AppDomain.AssemblyResolve的事件处理程序。 留下与一个app.exe.config文件<probing>
或<codebase>
元素。 您必须将其与非托管EXE同名,并将其与EXE存储在相同的文件夹中。
如果EXE不是你的,并且不能完全解决将东西放在EXE目录之外的目的,这往往是不明智的。 GAC是一种简单的解决方法。
链接地址: http://www.djcxy.com/p/44489.html