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ボックスでも同じエラーが発生します。
ヘルプ!