我已經構建了一個C++ dll,我想從C#代碼調用。我可以調用一個函數,但是當C#代碼嘗試加載dll時,另一個會引發異常。從C++ dll導出函數到C#P/Invoke
頭看起來像這樣:(?這是什麼富= foo的名稱字段的意思)
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
這將產生與略顯混亂出口表中的DLL:
File Type: DLL
Section contains the following exports for PPPManager.dll
00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000078E4 Install = Install
2 1 000079DC PPPConnect = PPPConnect
我的P /調用聲明如下所示:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
對安裝的調用沒有任何異常返回,但當我調用PPPConnec t,我得到一個MissingMethodException - 「在PInvoke DLL'PPPManager.dll'中無法找到入口點'PPPConnect'」。
我試着從安裝函數聲明中刪除extern和declspec指令,以便PPPConnect是唯一導出的函數,並且這仍然不會讓我調用PPPConnect。
我也試着按順序做DllImport;這給出了與名稱調用相同的結果 - 安裝返回,但PPPConnect拋出異常「無法找到入口點'#2'...」。
互操作的日誌給:
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();
JIT ERROR FOR PINVOKE METHOD (Managed -> Native):
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
這是好我的專業領域之外,因此任何建議或想法將受到歡迎。
感謝, 保羅
編輯: 事實證明,這個代碼工作;問題是最新的dll沒有傳播到設備。 D'哦!
我從來沒有聽說過這種互操作的日誌 - 如何使一個/查看? – Charlie 2009-02-21 02:04:23
http://blogs.msdn.com/netcfteam/archive/2005/07/24/442609.aspx 我剛開始使用它來嘗試和調試這個問題,但它似乎爲我節省了很多實時調試MissingMethodExceptions。 – Symmetric 2009-02-24 00:31:25