System.DllNotFoundException с использованием easyHook в Visual Studio 2010
Вопрос
У меня следующий код:
try
{
Debug.WriteLine("Hook Start");
RecvHook = LocalHook.Create(
LocalHook.GetProcAddress("ws2_32.dll", "recv"),
new Drecv(recv_Hooked),
this);
RecvHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
}
catch (Exception ExtInfo)
{
Debug.WriteLine("Error creating Hook");
}
...
[DllImport("ws2_32.dll")]
static extern int recv(
IntPtr socketHandle,
IntPtr buf,
int count,
int socketFlags
);
[UnmanagedFunctionPointer(CallingConvention.StdCall,
CharSet = CharSet.Unicode,
SetLastError = true)]
delegate int Drecv(
IntPtr socketHandle,
IntPtr buf,
int count,
int socketFlags
);
static int recv_Hooked(
IntPtr socketHandle,
IntPtr buf,
int count,
int socketFlags)
{
byte[] test = new byte[count];
Marshal.Copy(buf, test, 0, count);
IntPtr ptr = IntPtr.Zero;
ptr = Marshal.AllocHGlobal(count);
Marshal.Copy(test, 0, ptr, count);
string s = System.Text.UnicodeEncoding.Unicode.GetString(test);
Debug.WriteLine(s);
System.IO.StreamWriter file = new System.IO.StreamWriter("log.txt");
file.WriteLine(s);
file.Close();
return recv(socketHandle, buf, count, socketFlags);
}
Когда я запускаю проект, я получаю следующую ошибку:
A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in System.Windows.Forms.dll
Inizio Hook
A first chance exception of type 'System.DllNotFoundException' occurred in EasyHook.dll
A first chance exception of type 'System.DllNotFoundException' occurred in EasyHook.dll
Error creating Hook
Любое предложение о том, что может вызвать эту ошибку? Я добавил ссылку на все необходимые DLL ...
Решение
Более вероятный: Попробуйте запустить VS 2010 в качестве администратора. Я фактически сделал свой сочетание меню VS Start «запустить в качестве администратора», поэтому мне не нужно помнить.
Альтернативно: В документации EasyHook для метода инъекции упоминается, что: «Если вы введете библиотеку в любой целевой процесс, пожалуйста, имейте в виду, что ваш рабочий каталог будет переключен. EasyHook автоматически добавит каталог приложения инъекции в качестве первого каталога переменной среды пути цели. Поэтому убедитесь, что все необходимые зависимости Либо, расположенные в каталоге приложения инъекционного приложения, системным каталогом или любым каталогом по умолчанию, содержащейся в переменной пути »
Отчаянный последний курорт: Некоторые ошибки, по крайней мере, полу-бенецкие, так что вы можете пройти отладку в меню VS-> Исключения ... и снять ошибку, за исключением того, что он там не сломается. У меня был один или два случая, когда код на самом деле работал нормально, как только я сказал VS не сломать эту ошибку.
Кстати: какие двоичные файлы вы включили, какова ваша система архитектуры и ОС?
Другие советы
Я не могу дать вам точное решение, но можете ли вы иметь эти проблемы ...
Вы добавляете DLL в папку проекта/бин? Если да, скопируйте эту папку в System32 и снова добавьте в качестве ссылки на эту папку
Или попробуйте это, откройте командную строку Visual Studio и запустите эту команду regsvr32 yourdlllocationЗатем добавьте его в качестве ссылки сейчас.
Надеюсь, это решит проблему, и убедитесь, что ваш тип системы и тип DLL, оба должны быть для приложений Win32.