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...
2 ответа
Скорее всего: попробуйте запустить VS 2010 в качестве администратора. Я на самом деле сделал ярлык в меню "Пуск" VS "Запуск от имени администратора", поэтому мне не нужно запоминать.
В качестве альтернативы: в документации EasyHook для метода Inject упоминается, что: "Если вы внедряете библиотеку в какой-либо целевой процесс, имейте в виду, что ваш рабочий каталог будет переключен. EasyHook автоматически добавит каталог приложения для инъекций в качестве первого каталога объекта назначения. Переменная среды PATH. Поэтому убедитесь, что все необходимые зависимости находятся либо в каталоге приложения для инъекций, системном каталоге, либо в любом каталоге, который по умолчанию содержится в переменной PATH "
Отчаянное последнее средство: некоторые ошибки, по крайней мере, полулегкие, поэтому вы можете перейти в меню VS Отладка -> Исключения... и снять флажок с ошибочной ошибки, за исключением того, что она не будет сработать. У меня был один или два случая, когда код на самом деле работал нормально, как только я сказал VS не останавливаться на этой ошибке.
Кстати, какие двоичные файлы вы включили, какова ваша системная архитектура и ОС?
Я не могу дать вам точное решение, но, возможно, у вас возникли эти проблемы...
Вы добавляете dll в папку вашего проекта /bin? Если да, скопируйте эту папку в System32 и снова добавьте в качестве ссылки на эту папку
Или попробуйте это, откройте командную строку Visual Studio и запустите эту команду regsvr32 yourDLLLocation, а затем добавьте ее как ссылку.
Надеюсь, что это решит проблему, и убедитесь, что ваш тип системы и тип DLL, оба должны быть для приложений Win32.