如果在非托管代码(c++)中调用托管c#类库dll时不在.exe文件夹中,则获取FileNotFound异常
本文关键字:文件夹 exe 异常 FileNotFound 获取 dll c++ 非托管代码 调用 如果 类库 | 更新日期: 2023-09-27 18:07:10
我必须在用c++编写的本机代码中使用c#类库代码。为此,我添加了一个用c++编写的接口,并将我的c#类库项目作为依赖项添加到它。这工作得很好,直到我把c# dll在。exe文件夹,但我把它放在lib文件夹(我们保持我们的dll的地方),我得到文件没有发现异常时,试图调用c# dll函数。有没有办法保持c# dll在库文件夹,使其工作?
谢谢。
是的,您需要从libs文件夹中重新添加它,这样就可以了。或者,如果要在代码本身中命名DLL,那么只需提供完整路径和DLL名称。然后,当您重新编译时,.exe将包含您在源代码中给出的路径,并将在那里查找DLL。
从MSDN(LoadLibrary),备注部分::
搜索的第一个目录是包含图像的目录文件,用于创建调用进程(有关详细信息,请参阅CreateProcess功能)。这样做允许私有动态链接与要查找的进程关联的DLL文件将进程的安装目录添加到PATH环境中变量。如果指定了一个相对路径,则整个相对路径为附加到DLL搜索路径列表中的每个令牌。加载一个模块从一个相对路径,而不搜索任何其他路径,使用GetFullPathName获取一个非相对路径并调用LoadLibrary非相对路径。有关DLL搜索顺序的更多信息,请参见参见动态链接库搜索顺序。
搜索路径可以改变使用SetDllDirectory函数。推荐使用此解决方案而不是使用SetCurrentDirectory或硬编码的完整路径DLL。
如果指定了路径,并且有一个重定向文件应用程序中,函数查找模块应用程序的目录。如果该模块存在于应用程序的目录中,LoadLibrary会忽略指定的路径并加载模块从应用程序的目录。中不存在该模块应用程序的目录,LoadLibrary从指定的目录。有关更多信息,请参见动态链接库重定向。
如果用程序集的名称调用LoadLibrary没有路径规范,程序集将在系统中列出兼容的清单,则调用将自动重定向到并排组装。
这是所有你需要知道的关于dll的路径搜索。简单的解决方案是,在LoadLibrary
调用中输入完整路径或设置PATH
环境变量以包含dll的备用路径。