gpt4 book ai didi

c# - 托管 C dll 调用 C# dll,FileNotFoundException

转载 作者:行者123 更新时间:2023-11-28 07:45:14 27 4
gpt4 key购买 nike

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

主机应用程序调用非托管 C++ dll,调用托管 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 的事件处理程序。这会留下一个带有 <probing> 的 app.exe.config 文件或 <codebase>元素。您必须为其指定与非托管 EXE 相同的名称,并将其存储在与 EXE 相同的文件夹中。

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

关于c# - 托管 C dll 调用 C# dll,FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15036940/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com