在我的项目中,我有一个非托管的本机 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 等)。有什么想法无法加载,为什么?
更新 3 - 使用 Dependency Walker 测试在依赖 Walker 中加载我的非托管 C++ DLL 未显示任何错误。我还尝试在依赖项步行器中打开我的可执行文件,它显示加载两个 DLL 时出错:GPSVC.DLL 和 IESHIMS.DLL - 没有任何意义,因为我只在我的代码中使用标准 c++ 库。我认为这可能与我有一个托管 C++/CLI DLL 试图加载非托管 DLL 的事实有关(我试图实现一些 C++/CLI 包装器)。无论如何,我已经开始了一个新的 VS 解决方案并继续前进。看我的回答。