2011-07-29 17 views
2

Win32 DLLを実装する必要があり、WinCEのC#DllImportで呼び出す必要があります。 したがって、Win32スマートデバイスプロジェクトを作成し、Windows Mobile 5.0スマートフォンSDK を選択し、シンボルをエクスポートするオプションを使用してdllプロジェクトを作成します。 は、それから私は、関数宣言の前にextern "C" キーの単語を追加します。win32 smartpone dllを作成してWinCEのC#DllImportで呼び出す方法

の.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 Smartphoneプロジェクトはありません。 だから私はそれを試みるだけでなく、System.MissingMethodExceptionを取得しました。 その後、私はWin32 DLLで同じコードを試して、C#で呼び出すと動作します。 だから私はwinceが働くことができない理由はありません。 私はdllをコピーして実行可能ファイルフォルダを救済しました 誰かが私にいくつかのexpeienceを教えてもらえますか?

+1

dumpbinを使用して、DLLがexpexted nameの関数をエクスポートしたことを確認しましたか? – harper

+0

dumpbinを使ってDLLをチェックしましたが、その機能が見つかりませんでした。 プロジェクトの設定は必要ですか? –

答えて

2

ARMベースのSmartphone SDKを使用してこれを構築しました。 CE 5.0エミュレータはx86をエミュレートしているため、そこではコールバックできません。 CE 6.0デバイスも同様にx86ベースのデバイスであれば、同じ問題が発生します。 x86 SDKを使用して構築してみてください。

+0

ありがとうございます、私は仕事の日にテストします。 –

+0

ありがとう、それはOKです! –

1

WinCE2.dllは、WinCEデバイスのアプリケーション実行可能フォルダにコピーされません。 FileInfoを使って同じものを試してみてください。私はファイルを見つけることができません。プロジェクトの設定を確認し、wince2.dllを追加してコンテンツタイプとして設定し、新しいオプションの場合はコピーを提供します。

+0

WinCE2.dllがWinCEデバイスのapp実行可能フォルダにコピーされます。 WinCEエミュレータとWinCEデバイスフォルダにコピーしましたが、MissingMethodExceptionもあります。 dllがfloferに存在しない場合は、FileIsNotExistのような例外がありますか? –

+0

.NETスマートフォンプロジェクトはプロジェクトへの参照を追加できないため、私は手動でコピーしました。 –