[英]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);
其他可能的問題:
DLL與試圖加載它的EXE不在同一目錄中。
您忘記了從DLL導出功能。 您需要在函數定義上使用.DEF文件或__declspec(dllexport)屬性。 使用“ dumpbin / exports fglove.dll”確定是否存在這種情況。
stdcall和cdecl編譯選項之間的混淆。 我感到困惑,因此請嘗試用上面的“ _cdecl”替換“ _ stdcall” 。 或者嘗試不使用任何屬性。
fglove的編譯器很可能會進行這種名稱修飾。
使用DUMPBIN fglove.dll
獲取真實名稱。
然后使用[DllImport("fglove.dll", EntryPoint='...')]
,其中...是真實名稱。
在Dependency Walker中查看導出符號的名稱。 很有可能是_fdImport或類似名稱,您將需要更新DLLImportAttribute以匹配導出的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.