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...


person kaharas    schedule 02.01.2011    source источник


Ответы (2)


Скорее всего: попробуйте запустить VS 2010 от имени администратора. На самом деле я сделал ярлык в меню «Пуск» VS «Запуск от имени администратора», поэтому мне не нужно помнить.

В качестве альтернативы: в документации EasyHook для метода Inject упоминается следующее: "Если вы внедряете библиотеку в какой-либо целевой процесс, имейте в виду, что ваш рабочий каталог будет переключен. EasyHook автоматически добавит каталог внедряющего приложения в качестве первого каталога переменной среды PATH цели. Поэтому убедитесь, что все необходимые зависимости расположены либо в каталоге внедряющего приложения, либо в системном каталоге, либо в любом каталоге, который по умолчанию содержится в переменной PATH"

Отчаянная крайняя мера: некоторые ошибки являются по крайней мере полубезобидными, поэтому вы можете перейти в меню VS Debug-->Exceptions... и снять отметку с вызывающей ошибку, за исключением того, что там она не сломается. У меня был случай или два, когда код действительно работал нормально, как только я сказал VS не ломаться из-за этой ошибки.

Кстати: какие двоичные файлы вы включили, какая у вас архитектура системы и ОС?

person DieDaily    schedule 25.01.2011

Я не могу дать вам точное решение, но могут ли у вас возникнуть эти проблемы...

  • Вы добавляете dll в папку проекта/bin? Если да, скопируйте эту папку в System32 и снова добавьте в качестве ссылки на эту папку.

  • Или попробуйте это, откройте командную строку Visual Studio и выполните эту команду regsvr32 yourDLLLocation, а затем добавьте ее в качестве ссылки сейчас.

Надеюсь, это решит проблему, и убедитесь, что ваш тип системы и тип dll должны быть для приложений win32.

person PawanS    schedule 25.01.2011