【问题标题】:Unable to find an entry point named找不到名为的入口点
【发布时间】:2012-12-15 04:49:04
【问题描述】:

我正在用 c# 编写一个应用程序,该应用程序使用 cpp 中编码的第三方 dll。我对 dll 进行了几次调用,除了一个之外,它们都在工作。

我的代码以下列方式进行调用:

return ObjectGetStringEntryID(pObject, strEntryID, strEntryID.Capacity);

[DllImport(EXTERNAL_DLL, CharSet = DefaultCharSet)]
protected static extern bool ObjectGetStringEntryID(IntPtr pObject, StringBuilder strEntryID, int nMaxLength);

由于我可以访问源代码,我知道它包含以下定义:

BOOL ObjectGetStringEntryID(CMAPIObject* pObject, LPTSTR szEntryID, int nMaxLength)

如前所述,我使用相同的格式对该 dll 进行了其他几次调用,它们都成功了。

因此,如果有帮助,我有以下设置:

public const CharSet DefaultCharSet = CharSet.Ansi;

有人看到我在通话中可能做错了什么吗?我来自同一个班级:

MessageGetSubject(pObject, strSubject, strSubject.Capacity);

[DllImport(EXTERNAL_DLL, CharSet = DefaultCharSet)]
protected static extern void MessageGetSubject(IntPtr pMessage, StringBuilder strSubject, int nMaxLength);

与方法匹配的:

void MessageGetSubject(CMAPIMessage* pMessage, LPTSTR szSubject, int nMaxLength)

这来自 c# 和 cpp 中的相同类,因为调用不起作用,但它工作得很好。它的调用方式似乎没有任何区别,因此它们都应该工作或不工作。

如果有人对我做错了什么有任何见解,我将不胜感激。

【问题讨论】:

  • 既然你的 C# 声明不同,你为什么期望它们是一样的
  • 我把第二个样本放在那里以表明我以同样的方式调用,并且它正在工作。找不到dll不是问题。在另一个类中,我通过发送所有相同的变量进行调用。与那些,唯一的区别是方法名称,但它们也被正确调用。
  • 你的意思是传递StringBuilder还是你打算传递一个字符串?
  • @Pete,文档说需要传递的是 StringBuilder 。我也觉得这很奇怪,但它适用于具有类似签名的其他方法。
  • 尝试将 Charset 更改为 CharSet.Ansi。你也可以尝试传递一个字符串而不是 stringbuilder ......我猜 stringbuilder 很好,但尝试一些东西永远不会有坏处。

标签: c# c++ pinvoke


【解决方案1】:

EntryPointNotFoundException 表示符号 ObjectGetStringEntryID 不是由 DLL 导出的。检查导出文件(或 __declspec 声明)以确保它已导出,并且使用该名称。

这可能会有所帮助:Exporting from a DLL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多