Я разрабатываю 64-битную версию Windows 7 с Visual Studio 2012 (11.0.51106.01 Update 1).Ошибка «Указанная процедура не найдена». NET 4
У меня есть проект поддержки, который компилирует некоторый код 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;
}
У меня тоже есть (32-разрядная версия) WPF C# приложение, которое загружает DLL внутри класса следующим образом:
[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()
я использовал зависимость ходок как на моем скомпилированный ехе и DLL; единственные недостающие DLL, которые он нашел, были wer.dll
и ieshims.dll
, которые из моих исследований не нужны на XP.
Я установил VS2012 C++ Redistributable и .NET 4 и обновление .NET 4.0.3. Еще не повезло.
Редактировать Как Hans указывает, это появляется быть, что приложение не может найти процедуру в 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.
Помощь!
Это не жалоба на недостающую DLL, она не может найти функцию "test_dll_call" в DLL. Очень мало способов, которые могут пойти не так, как если бы они скопировали неправильную DLL. –
Хорошо, так что это за другие способы? Он работает на моей dev-боксе, но не на моем тестовом ноутбуке WinXP. –