C# 使用DllImport将非托管dll加载到托管应用程序中 在我的项目中,我有一个非托管的本地C++ DLL和一个C语言应用程序。我正在尝试使用DllImport从非托管dll导入函数,但我一直收到DllNotFoundException

C# 使用DllImport将非托管dll加载到托管应用程序中 在我的项目中,我有一个非托管的本地C++ DLL和一个C语言应用程序。我正在尝试使用DllImport从非托管dll导入函数,但我一直收到DllNotFoundException,c#,c++,dllimport,unmanaged,dllnotfoundexception,C#,C++,Dllimport,Unmanaged,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( [MarshalA

这是我调用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(字符串、数学、IoString等)中使用基本C++库。有什么想法不能加载,为什么

更新3-使用Dependency Walker进行测试
在依赖性Walk中加载非托管C++ DLL没有显示错误。我还试图在依赖性沃克打开我的可执行文件,它显示了加载两个DLL的错误:GPSVC.DLL和iSim.dll——没有任何意义,因为我只在我的代码中使用标准C++库。我认为这可能与我有一个托管的C++/CLI DLL试图加载非托管的DLL(我试图实现一些C++/CLI包装器)有关。无论如何,我已经开始了一个新的VS解决方案并继续前进。请参阅我的答案。

要进行测试,*.dll需要与尝试加载它的.exe位于同一目录中。在这一点上,不要相信VisualStudio会为您做这件事。物理地将文件复制到C:******\Debug\x86\bin\或您正在运行的任何配置。如果有疑问,请将其复制到您的所有bin文件夹中。找到路径后,您就可以开始寻找自动生成项目的方法,以正确复制文件。如果这样做不行,就把它放在system32中——它肯定会在那里找到它。然而,如果在做了这些事情之后,你仍然找不到它。您的非托管dll可能也缺少一个依赖项。

问题很可能不是您试图加载的dll,而是它的一个(链接的)依赖项。在DLL上运行Dependes.exe或类似实用程序,查看是否可以找到所有依赖项。“无法找到指定的模块”这一误导性消息已经成为一个经典的烦恼(如果不是常见问题解答材料!):它让你认为DLL没有被找到,而几乎所有的时间都是它的一个依赖项没有被找到

首先我要感谢大家的帮助。不幸的是,我从未解决过这个问题(请参阅我主要问题中的编辑)。答案是启动一个全新的VisualStudio解决方案,并创建两个新项目:C应用程序和C++ DLL。我不再需要包装器,因为我现在只是整理两个主要函数


再次感谢。

用户arayq2的回答很有意义,我也很快解决了我的问题

在我的例子中,无法加载的dll(DllNotFoundException)依赖于另一个dll。这个dll(不是我项目的一部分)实际上是用某些.h和.lib文件的较新版本编译的。这些.h和.lib文件的旧版本(具有相同的文件名)是编译无法加载的dll的项目的一部分

在我用这些.h和.lib文件的更新版本更新了我的dll项目并重新编译了我的dll项目之后,我的问题就解决了


谢谢你,再见

可能与路径变量有关,但我认为通常程序目录在其中…尝试删除dllimporttry的“.dll”部分尝试输入dllRemoved.dll的完整路径,但仍然会出现错误。谢谢。我尝试了完整的路径,但仍然显示模块找不到。我在想还有什么东西阻止模块加载。。。