在我的项目中,我有一个非托管的本机C++ dll和一个C#应用程序。我试图使用DllImport从非托管dll导入一个函数,但是我一直得到一个DllNotFoundException。
下面是调用DLL的代码。
using System.Runtime.InteropServices;
namespace TestApp
{
public delegate void UpdateDelegate(string s);
class Program
{
[DllImport("CGPUnmanagedLibrary.dll")]
internal static extern int parse_raw_gsod_file(
[MarshalAs(UnmanagedType.LPStr)]
string filePath,
int minTemp,
UpdateDelegate callBack);
static void Main(string[] args)
{
UpdateDelegate myCallBack = new UpdateDelegate(Program.Report);
string path = @"C:\Creative Solutions\Projects\Clyde's Garden Planner\Frost Data Database\GSOD Data\GSOD_RAW_DATA\1992\gsod_1992.txt";
int result = parse_raw_gsod_file(path, 32, myCallBack);
Console.Write("Parse completed with exit code: " + result.ToString());
Console.ReadLine();
} // end main function
public static void Report(string msg)
{
Console.Write("Message is ");
Console.WriteLine(msg);
}
} // End class
} // end namespace我尝试将DLL复制到应用程序输出目录,但它仍然找不到它。我也尝试添加DLL项目作为参考,但我得到一个弹出窗口,说它不能添加。如何正确地将未处理的DLL链接到托管应用程序?
更新-以下是完整的错误:
Unable to load DLL 'CGPUnmanagedLibrary': The specified module could not be found. (Exception from HRESULT: 0x8007007E)更新2 -我确信DLL与试图加载它的.exe位于同一个目录中。这使我认为DLL中有一个没有加载的依赖项。我只使用DLL中的基本C++库(字符串、数学、iostream等)。任何想法,什么不能加载和为什么?
Update3-在Dependency中加载非托管C++ DLL的dependency进行了测试,没有显示错误。我还试图在dependency中打开我的可执行文件,它显示了加载两个DLL的错误: GPSVC.DLL和IESHIMS.DLL -没有任何意义,因为我只在代码中使用标准c++库。我认为这可能与我有一个托管C++/CLI DLL试图加载非托管DLL有关(我试图实现一些C++/CLI包装器)。无论如何,我已经开始了一个新的VS解决方案,并继续前进。看看我的答案。
发布于 2013-01-30 02:10:51
首先,我要感谢大家的帮助。不幸的是,我从未解决过这个问题(参见我的主要问题中的编辑)。答案是启动一个全新的Visual解决方案并创建两个新项目: C#应用程序和C++动态链接库。我消除了对包装器的需求,因为我现在只是封送两个主要功能。
再次感谢。
发布于 2013-01-26 03:05:36
很可能问题不是您要加载的DLL,而是它(链式的)依赖项之一。在DLL上运行depends.exe或类似的实用程序,以查看是否可以找到所有依赖项。误导性的消息“无法找到指定的模块”已经成为一个典型的烦恼(如果不是FAQ材料!):它导致您认为您的DLL没有被发现,而几乎所有时候它都是它的依赖项之一,没有被找到。
发布于 2013-01-26 01:36:16
要进行测试,*.dll需要与试图加载它的.exe位于同一个目录中。在这一点上,不要相信会为您做这件事。物理地将文件复制到C:*\Debug\x86\bin\或您正在运行的任何配置。如果有疑问,请将其复制到所有的bin文件夹中。找出路径之后,就可以找到自动生成项目以正确复制文件的方法。如果这样做不起作用,就把它放到system32 32中--它肯定会在那里找到它的。然而,如果做了这些事情,你仍然找不到它。可能也缺少对非托管dll的依赖关系。
https://stackoverflow.com/questions/14532712
复制相似问题