2013-02-15 3 views
4

Я разрабатываю 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.

Помощь!

+0

Это не жалоба на недостающую DLL, она не может найти функцию "test_dll_call" в DLL. Очень мало способов, которые могут пойти не так, как если бы они скопировали неправильную DLL. –

+2

Хорошо, так что это за другие способы? Он работает на моей dev-боксе, но не на моем тестовом ноутбуке WinXP. –

ответ

6

Проблема решена. Некоторые вещи следует отметить, когда я прошел шаги по устранению неполадок, для тех, кто наткнется на это в будущем.

  1. Эта ошибка не обязательно означает, что он не может найти процедуру X - а это может означать, что не может найти функцию Y, из другой библиотеки DLL, которая вызывается X.
  2. Не забудьте скомпилировать DLL в режиме «Release», поскольку перераспределяемый C++ не будет включать отладочную DLL.
  3. Начните с функции оболочки и добавьте части назад, один за другим.

В моем примере выше, проблема заключалась в компиляции в качестве отладочной версии.

Однако в моей полной функции это изменение не устранило проблему. Оказывается, мне не хватало некоторых DLL-файлов, которые ходок-манипулятор не поймал.

Смежные вопросы