2011-07-29 67 views
2

我需要實現Win32 DLL並需要通過WinCE中的C#DllImport調用它。 因此,我創建了一個Win32智能設備項目,並選擇Windows Mobile 5.0智能手機SDK, ,並使用導出符號選項創建一個dll項目。 後來我之前函數聲明添加的extern 「C」 關鍵詞:如何通過WinCE中的C#DllImport創建win32 smartpone dll和調用

.H

#ifdef WINCE2_EXPORTS 
#define WINCE2_API __declspec(dllexport) 
#else 
#define WINCE2_API extern "C" __declspec(dllimport) 
#endif 
extern "C" WINCE2_API int __cdecl Add(int A,int B); 

的.cpp

extern "C" WINCE2_API int __cdecl Add(int A,int B) 
{ 
    return A+B; 
} 

當我在C#中使用的DllImport:

[DllImport("WinCE2.dll", EntryPoint = "Add")] 
static extern int Add(int A, int B); 

我總是得到一個System.MissingMethodException在WinCE 5.0仿真器和WinCE6.0設備中

我在google搜索了一些資料,發現了一些解決辦法。 首先,添加.DEF項目:

LIBRARY  "WinCE2" 
EXPORTS 
Add   DATA 

但是,在一個論壇上有人說__declspec(dllexport)的可替代的DEF文件。 但是這個解決方案也得到了System.MissingMethodException。

然後我發現堆棧溢出的解決方案: 我可能需要添加__cdecl關鍵字。 而我創建了一個Win32 DLL項目,我發現項目設置會在默認情況下添加__cdecl。 但Win32智能手機項目不是。 所以我嘗試了,但也得到了System.MissingMethodException。 然後我在Win32 DLL中嘗試相同的代碼並通過C#調用,它可以工作。 所以我不爲什麼wince不能工作。 我已經將dll複製到wince可執行文件文件夾 任何人都可以分享我的一些經驗嗎?

+1

您是否使用dumpbin檢查過,該DLL是否以導出的名稱導出函數? – harper

+0

我用dumpbin來檢查DLL,但是我找不到這個函數。 我是否需要任何項目設置? –

回答

2

您是使用基於ARM的Smartphone SDK構建的。 CE 5.0仿真器模擬x86,所以它不會在那裏被調用。如果您的CE 6.0設備同樣是基於x86的,它也會遇到同樣的問題。嘗試使用x86 SDK構建它。

+0

謝謝,我會在工作日內進行測試。 –

+0

謝謝,這沒關係! –

1

您的WinCE2.dll未複製到WinCE設備應用程序可執行文件夾。嘗試使用FileInfo獲得相同的結果。我無法找到該文件。檢查項目設置並添加wince2.dll並將其設置爲內容類型,並提供新的選項。

+0

將WinCE2.dll複製到WinCE設備應用程序可執行文件夾。 我複製它在我的WinCE模擬器和WinCE設備文件夾中,但也得到了MissingMethodException。 如果dll不存在flofer,也許我有一個異常像FileIsNotExist? –

+0

和.NET智能手機項目無法添加項目引用,所以我手動複製。 –