在我的项目中,我有一个未经管理的本地C++ DLL和一个C#应用程序。我正在尝试使用DllImport从未经管理的DLL导入函数,但我一直收到DllNotFoundException。
以下是调用DLL的代码。
我尝试将DLL复制到应用程序输出目录,但它仍然找不到。我还尝试将DLL项目添加为引用,但弹出窗口显示无法添加。如何正确地将非托管DLL链接到托管应用程序? 更新 - 这是完整的错误信息:
以下是调用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++库(如string、math、iostream等)。有什么想法是哪些内容没有被加载以及原因吗?
更新3 - 使用Dependency Walker进行测试
在Dependency Walker中加载我的非托管C++ DLL文件时没有显示任何错误。我还尝试在Dependency Walker中打开我的可执行文件,结果显示有两个DLL文件无法加载:GPSVC.DLL和IESHIMS.DLL - 这没有任何意义,因为我的代码中只使用了标准的C++库。我认为这可能与我有一个托管C++/CLI DLL文件试图加载非托管DLL文件有关(我试图实现一些C++/CLI包装器)。无论如何,我已经开始了一个新的VS解决方案并继续前进。请参见我的答案。