【问题标题】:using dllimport使用 dllimport
【发布时间】:2009-10-12 12:38:31
【问题描述】:

我正在尝试在以下代码中使用DllImport 属性:

[DllImport("grfinger.dll",EntryPoint="_grstartenroll@4")]
public static extern int startenroll(int context);

为了获得函数名,我使用了 dumpbin /export。当我运行代码时,出现以下异常:

Unable to find an entry point name '_grstartenroll@4' in DLL 'grfinger.dll'.

我该如何解决这个错误?

【问题讨论】:

    标签: c# pinvoke name-decoration


    【解决方案1】:

    _grstartenroll@4 是 dll 中的decorated function name

    这看起来像标准的调用约定命名,你可以试试:

    [DllImport("grfinger.dll",EntryPoint="_grstartenroll@4", CallingConvention=CallingConvention.StdCall]
    public static extern int startenroll(int context);
    

    否则我会尝试获取未修饰的函数名称,您可以将 dumpbin 的输出通过管道传递给 undname,如下所示:

    dumpbin /exports grfinger.dll | undname _grstartenroll@4

    然后在您的 dll 导入中使用未修饰的函数名称。

    【讨论】:

    • +1,除了dumpbin,你还可以查看这个免费工具:“Dependency Walker”(又名“depends”)dependencywalker.com
    • Dependency Walker 是一个不错的选择,而且下载量这么小
    【解决方案2】:

    在不了解特定函数或库的情况下:我相信将入口点指定为 entrypoint="startenroll"entrypoint="#4" 而不是 dumpbin 输出可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多