Я ищу способ внедрения (добавления / замены) кода методов в управляемые сборки сторонних разработчиков .NET во время выполнения. Я делаю это с помощью C # в VS2017.
Я пытался:
- PlayHooky (https://github.com/wledfor2/PlayHooky), отлично работает, но не поддерживает оригинальные вызовы методов, и для проекта, над которым я работаю, я хочу что-то хорошо протестированное и надежное.
- Easyhook (https://easyhook.github.io), примеры в Интернете показывают, как внедрить управляемый код в неуправляемые API, не удалось найти информацию, даже если он предназначен для внедрения управляемых в управляемые.
- Deviare v.2.0 (http://whiteboard.nektra.com/deviare-v-2-0), просто не работал, даже после их Руководства по быстрому запуску, никакой информации о поддержке целевых управляемых сборок.
Вот код EasyHook, который у меня не работал:
TestClass r = new TestClass();
MethodInfo originalMethodInfo = typeof(TestClass).GetMethod(nameof(TestClass.DoSomething));
IntPtr originalMethodInfoPtr = originalMethodInfo.MethodHandle.GetFunctionPointer();
MethodInfo replacementMethodInfo = typeof(Program).GetMethod(nameof(Program.DoSomething));
IntPtr replacementMethodInfoPtr = replacementMethodInfo.MethodHandle.GetFunctionPointer();
//Create hook
using (LocalHook hook = EasyHook.LocalHook.CreateUnmanaged(originalMethodInfoPtr, replacementMethodInfoPtr, IntPtr.Zero))
{
hook.ThreadACL.SetInclusiveACL(new int[1]);//Enable hook
r.DoSomething();//Call original method, expecting replacement method to be called
Console.ReadKey();
}
Когда я пытался использовать EasyHook.LocalHook.Create
, я получал "Managed Debugging Assistant 'Reentrancy' : 'Attempting to call into managed code without transitioning out first..."
исключение.
Я ищу какие-либо идеи, как заставить EasyHook работать, или какие-то альтернативные способы достижения управляемого подключения на лету.