ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-26 00:08:25  阅读:438  来源: 互联网

标签:c unmanaged dllimport c-2 dllnotfoundexception


在我的项目中,我有一个非托管的本机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复制到app输出目录,但仍然无法找到它.我也尝试添加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显示没有错误.我还尝试在依赖walker中打开我的可执行文件,它显示加载两个DLL的错误:GPSVC.DLL和IESHIMS.DLL – 没有任何意义,因为我只在我的代码中使用标准c库.我认为这可能与我有一个托管C/C++LI DLL试图加载非托管DLL的事实有关(我试图实现一些C/C++LI包装器).无论如何,我已经开始了一个新的VS解决方案并继续前进.看我的回答.

解决方法:

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

标签:c,unmanaged,dllimport,c-2,dllnotfoundexception
来源: https://codeday.me/bug/20190825/1724128.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有