12

基本的なシナリオをWindowsMo​​bile5.0エミュレーターで動作させるのに多くの問題があります。最終的にネイティブコードを呼び出すwinformsアプリがあります。展開は正常に機能し、すべてのネイティブDLLがwinforms.exeと同じフォルダーにコピーされます。また、これがリモートファイルビューアツールの場合であることを確認しました。

ただし、アプリを起動すると、常に「PInvoke dllが見つかりません-System.MissingMethodException」エラーで失敗します(ネイティブコードを呼び出すときに、DllImport属性が使用できなくなります)。ネイティブdllが実行可能ファイルと同じフォルダーにあることを知っています。これ以上何をすべきですか?

VS2008を使用しています。

4

4 に答える 4

9

Jaredの答えを拡張するために、CFでのP/呼び出し中にMissingMethodExceptionが発生する4つの一般的な理由:

  1. 呼び出しているネイティブライブラリの依存関係がありません。
  2. ネイティブアセンブリが間違ったサブシステム(つまり、CEではなくデスクトップ)用にコンパイルされた
  3. ネイティブアセンブリが間違ったプロセッサ用にコンパイルされました(つまり、ARMではなくx86)
  4. DLLをロードするのに十分な仮想メモリがありません。

DLLエントリポイントがdumpbinのような装飾されていないことを確認しましたか?

于 2009-09-22T03:27:11.317 に答える
5

エラー メッセージを考えると、通常、2 つの問題のいずれかが存在します。

  1. DLL が見つかりません。DLL は、実行中のディレクトリと PATH 環境変数を調べることで見つかります。
  2. DLL 内で関数が見つかりません。DLL の宣言と定義の両方が extern "C" であり、次のようにマークされていることを確認しましたか?__declspec(dllexport)

また、サニティ チェックでは、DLL 名のスペルが正しく、.dll サフィックスがないことを確認します。

于 2009-09-21T18:43:29.287 に答える
0

あなたの問題は、WM5のメモリ管理がくだらないという事実によるものです。DLLはスロットの上から下にロードされ、アプリは下から上にロードされます。アプリとDLLの間に十分なスペースがない場合は、「ピンボークできません」というエラーが表示されます。

WM5は、実行するアプリケーションに32Mbの32スロットを割り当てます。

WM5がdllにメモリを割り当てるたびに、最小64Kbブロックを使用するため、DLLが32Kの場合は64k、DLLが68kの場合は、WM5は2x64Kb —128Kbを割り当てます。

WM5が必要なDLLをロードすると、常に以前にロードされたアプリの一番下のアドレスにロードされます。つまり、アプリ1が2×30kbのDLLをロードした場合、最初のDLLはアドレス0〜64kにロードされ、2番目のDLLは64〜128にロードされます。の場合、アプリが別のスロットで実行されている場合でも、アプリは0ではなく128kbからDLLをロードします。

動作させるには、アプリを早めに読み込むか、不要なアプリをWindowsのスタートアップフォルダーから削除する必要があります。

于 2009-12-29T15:14:27.267 に答える
-1

使用している DLL には、呼び出しているメソッドの定義がありません。そのため、例外が発生します..正常にコンパイルされます..実行時にのみ問題が発生します..解決策は、DLLに定義が存在するかどうかを確認する必要があるかどうかです。

于 2009-09-29T05:08:27.800 に答える