4

Visual Studio 2012 (11.0.51106.01 Update 1) を搭載した 64 ビット Windows 7 ボックスで開発しています。

一部の C コードを (32 ビット) DLL にコンパイルするサポート プロジェクトがあります。私のヘッダーには次のものがあります。

#define RET_TYPE(type) _declspec(dllexport) type __stdcall

RET_TYPE(int) test_dll_call(int invar);

私のCファイルには次のものがあります:

RET_TYPE(int) test_dll_call(int invar)
{
   int retVal = 4 * invar;

   return retVal;
}

次のように、クラス内に DLL をロードする (32 ビット) WPF C# アプリケーションもあります。

[DllImport("MyDll.dll", CharSet = CharSet.Ansi, BestFitMapping = true, ThrowOnUnmappableChar = true)]
public static extern int test_dll_call(int invar);

これは次のようにラップされます。

public void Wrap_TestDllCall()
{
   try
   {
      int outTest = 0;
      int invar = 3;

      outTest = test_dll_call(invar);
   }
   catch (Exception ex)
   {
      dllError = ex.ToString();
   }
}

これを開発ボックスのデバッガーで実行すると、正常に動作します。関連するすべてのファイルを別のフォルダーにコピーしてそこから実行すると、正常に動作します。

必要なすべてのフォルダーを、32 ビット Windows XP SP3 を実行している別のコンピューターにコピーすると、次のエラーが表示されます。

System.DllNotFoundException: Unable to load DLL 'MyDll.dll': The specified procedure could not be found. (Exception from HRESULT: 0x8007007F)
   at MyNamespace.MyClass.test_dll_call(Int32 invar)
   at MyNamespace.MyClass.Wrap_TestDllCall()

コンパイル済みのexeとdllの両方で依存関係ウォーカーを使用しました。見つからなかった dll は と だけwer.dllでしieshims.dllた。これらは、私の調査では XP では必要ありません。

VS2012 C++ Redistributable、.NET 4、および .NET 4.0.3 アップデートをインストールしました。まだ運がありません。

ハンスが指摘しているように、これ、アプリが DLL でプロシージャを見つけられないことのようです。私も試しました:

[DllImport("MyDll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int test_dll_call(int invar);

__declspec(dllexport) int __cdecl test_dll_call(int invar);

私のdevボックスでも問題なく動作しますが、WinXPボックスでも同じエラーが発生します。

ヘルプ!

4

1 に答える 1

6

問題が解決しました。将来これに出くわした人のために、トラブルシューティングの手順を実行したときに注意すべき点がいくつかあります。

  1. このエラーは、必ずしもプロシージャが見つからないことを意味するわけではありません。むしろ、によって呼び出される別の dll からXfunction が見つからないことを意味する場合があります。YX
  2. C++ 再頒布可能パッケージにはデバッグ DLL が含まれないため、DLL は必ず「リリース」モードでコンパイルしてください。
  3. シェル関数から始めて、ピースを 1 つずつ追加します。

上記のテスト例では、デバッグ バージョンとしてコンパイルしていたことが問題でした。

ただし、私の完全な機能では、その変更は問題を解決しませんでした。依存関係ウォーカーがキャッチしなかったいくつかの DLL が欠落していたことがわかりました。

于 2013-02-20T04:21:33.917 に答える