0

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

主机应用程序调用非托管 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。

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

4

1 回答 1

1

默认情况下,CLR 仅在两个位置查找程序集:首先是 GAC,其次是启动 EXE 的目录。让它在别处寻找需要额外的工作。一种可能性是,在这种情况下,您不能为 AppDomain.AssemblyResolve 订阅事件处理程序。这会留下一个带有<probing>or<codebase>元素的 app.exe.config 文件。您必须为其指定与非托管 EXE 相同的名称,并将其存储在与 EXE 相同的文件夹中。

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

于 2013-02-23T05:03:53.517 回答