使用DllImport将非托管dll加载到托管应用程序中

在我的项目中,我有一个非托管的本机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 SolutionsProjectsClyde's Garden PlannerFrost Data DatabaseGSOD DataGSOD_RAW_DATA1992gsod_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项目作为参考,但我得到一个弹出窗口,说它不能被添加。 你如何正确地链接一个unmanged 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显示没有错误。 我也尝试在依赖walker中打开我的可执行文件,它显示加载两个DLL的错误:GPSVC.DLL和IESHIMS.DLL - 没有任何意义,因为我只在我的代码中使用标准c ++库。 我认为这可能与我有一个托管的C ++ / CLI DLL尝试加载非托管DLL(我试图实现一些C ++ / CLI包装)有关。 无论如何,我已经开始了一个新的VS解决方案,并继续前进。 看到我的答案。


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


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


首先我要感谢大家的帮助。 不幸的是,我从未解决过这个问题(请参阅我的主要问题中的编辑)。 答案竟然是开始一个全新的Visual Studio解决方案并创建两个新项目:C#应用程序和C ++ dll。 我不再需要包装,因为我现在只是编组两个主要功能。

再次感谢。

链接地址: http://www.djcxy.com/p/44457.html

上一篇: Using DllImport to load unmanaged dll into managed application

下一篇: Unable to load DLL (Module could not be found HRESULT: 0x8007007E)