使用C#调用DLL

时间:2011-05-21 04:50:12

标签: c# pointers dll struct call

typedef struct
{
    // The contents of this struct are platform-dependent and subject to
    // change. You should not manipulate the contents of this struct directly.

    /*New stuff*/
//  HWND            m_hWnd;
//  HDEVNOTIFY      m_hDevNotify;

} fdGlove;


FGLOVEAPI fdGlove *fdOpen(char *pPort, bool bOnlyAllowSingleConnection = false);    
FGLOVEAPI int   fdClose(fdGlove *pFG);
FGLOVEAPI int   fdGetGloveHand(fdGlove *pFG);
FGLOVEAPI int   fdGetGloveType(fdGlove *pFG);

我有一个名为fglove.dll的DLL文件,我需要使用C#来调用它。 我写了这样的代码:

    [StructLayout(LayoutKind.Sequential)]
    public class fdGlove
    { 

    }
    [DllImport("fglove.dll")]
    public static extern fdGlove fdOpen(string pPort, bool bOnlyAllowSingleConnection);

但是当我调试程序时它有一个错误(无法在DLL'fglove.dll'中找到名为'fdOpen'的入口点。)

有人可以指出我做错了吗?

3 个答案:

答案 0 :(得分:3)

fdOpen正在使用默认参数 - 这只能意味着您正在尝试从DLL中导出C ++函数。结果是“fdOpen”在导出表中被“名称损坏”,看起来像“fdOpen @ YAXPB_W0I @ Z”。

最好将此函数导出为C.声明并定义fdOpen,如下所示:

extern "C" fdGlove* __stdcall fdOpen(char* pPort, bool bOnlyAllowSingleConnection);

其他可能的问题:

  1. DLL与尝试加载它的EXE不在同一目录中。

  2. 您忘记从DLL导出该函数。您需要在函数定义中使用.DEF文件或__declspec(dllexport)属性。使用“dumpbin / exports fglove.dll”来判断是否是这种情况。

  3. stdcall和cdecl编译选项之间的混淆。我感到困惑,所以尝试将“_ stdcall”替换为上面的“ _cdecl”。或者尝试没有任何属性。

答案 1 :(得分:1)

fglove的编译器最有可能进行名称修改。

使用DUMPBIN fglove.dll获取真实姓名。

然后使用[DllImport("fglove.dll", EntryPoint='...')],其中......是真实姓名。

答案 2 :(得分:0)

查看Dependency Walker中导出符号的名称。它很可能是_fdImport或类似的东西,你需要更新你的DLLImportAttribute以匹配导出的名称。