簡體   English   中英

使用C#調用DLL

[英]Calling DLL using C#

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”的入口點。)

有人可以指出我做錯了什么嗎?

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編譯選項之間的混淆。 我感到困惑,因此請嘗試用上面的 _cdecl”替換“ _ stdcall” 或者嘗試不使用任何屬性。

fglove的編譯器很可能會進行這種名稱修飾。

使用DUMPBIN fglove.dll獲取真實名稱。

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

在Dependency Walker中查看導出符號的名稱。 很有可能是_fdImport或類似名稱,您將需要更新DLLImportAttribute以匹配導出的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM