从 C++/CLR 调用远程 C# dll 时出现 FileNotFoundException

本文关键字:dll FileNotFoundException C++ CLR 调用 | 更新日期: 2023-09-27 17:56:57

我的项目是用本机C++构建的平台的插件。该插件将重用基于 .NET Framework 4.0 构建的现有 C# 项目的当前功能。我们使用 C++/CLR 作为调用 C# 代码的桥接。也就是说,内置于非托管 c++ 中的主机应用程序调用托管C++ dll,后者调用 C# dll。

平台将在一个进程中运行,插件将在另一个进程中运行。平台找到插件dll的方法是用户将在平台的用户界面中输入一个目录,因此平台将该目录中的所有插件dll加载到插件进程中。

当我的插件文件夹是本地文件夹时,这很有效。但是,当我将插件文件夹设置为远程文件夹时,当我尝试从C++/CLR类实例化C#类时,我得到了一个FileNotFoundException,详细信息是"未知URL协议"。

我们的插件项目有 C++/CLR 和 C# 代码,内置到不同的 dll 文件中。在调试模式下,在 Visual Studio 模块视图中,事实证明加载了 C++/CLR dll,而未加载 C# dll(两者都在应用目录中)。当我尝试在 C++/CLR 代码中实例化托管类时,会发生异常,但是,不幸的是,当我收到异常时没有堆栈调用。

那么如何允许主机插件进程正确加载远程 C# dll?

从 C++/CLR 调用远程 C# dll 时出现 FileNotFoundException

经过进一步调查,我们发现根本原因是插件的应用程序库设置不正确。出于某种原因,如果将文件夹设置为远程文件夹,则平台将以 Linux 格式而不是 Windows 格式传递文件夹,并且我们的软件仅在 Windows 上运行。这就是为什么抛出"FileNotFoundException"的原因,当我的插件文件夹是本地文件夹时,它运行良好。我们需要以窗口路径格式更正应用程序库。