0

Windows Mobile SDK用のネイティブdllをコンパイルし、それを呼び出すためのc#プロジェクトを作成しました。ただし、取得するのはMissigMethodExceptionだけです。

DLLは、管理対象の実行可能ファイルと同じフォルダにあります。

エクスポートされた関数がヘッダーでどのように表示されるかを次に示します。

namespace cuttingStream
{
    /**
     * Открывается файл и производится его проверка.
    **/
    __declspec(dllexport) bool open_png_file(char* , pngDataStructures* );
    __declspec(dllexport) void close_png_file(pngDataStructures*);
    ...
}

これが私がそれらをインポートする方法です:

static class CuttingStreamWrapper
{
    [DllImport("libpngStreamWrap.dll", EntryPoint = "open_png_file")]
    public static extern bool OpenPngFile(string fileName, out pngDataStructures dataStruct);
    [DllImport("libpngStreamWrap.dll", EntryPoint = "close_png_file")]
    public static extern bool ClosePngFile(ref pngDataStructures dataStruct);
}

これがdumpbinの出力(関連部分)です:

1    0 00001340 ?close_png_file@cuttingStream@@YAXPAUpngDataStructures@@@Z
2    1 00001194 ?open_png_file@cuttingStream@@YA_NPADPAUpngDataStructures@@@Z

ソースファイルとヘッダーの両方で関数をマークした後extern "C"、dumpbinの出力は次のように変更されました。

ordinal hint RVA      name

      1    0 00001314 close_png_file
      2    1 0000118C open_png_file

壊れていないようです。

ただし、問題は残ります。これが私が受け取る例外です:

System.MissingMethodException was unhandled
  Message="Не удается найти PInvoke DLL \"libpngStreamWrap.dll\"."

StackTraceには、ラップされた関数を呼び出そうとするプログラムのメイン関数しかありません。

アップデート:

ロードしようとしているdllで依存関係ウォーカーを実行した後、Coredll.dll、msvcr90d.dllの2つの依存関係があります。私がそれらに展開しようとしているデバイスでは、msvcr80.dllのみです。これは、ロードの失敗を説明しています。

4

1 に答える 1

2

この問題は、デバイスに見つからないmsvcr90d.dllへのdllの依存関係に起因していました。(/MDdから/MTdに切り替えることで)依存関係が解消されると、dllが見つかりました。

于 2012-10-18T11:58:29.123 に答える