Я играю с генерацией собственного кода из C #. Я использую HeapCreate
и HeapAlloc
для выделения исполняемой памяти, в которую я пишу инструкции для x86-64. Затем я использую Marshal.GetDelegateForFunctionPointer
, чтобы превратить его в делегат .NET и вызвать его. Я могу правильно создать и вызвать простую функцию, которая возвращает постоянное значение.
Проблема в том, что я не могу войти в эту функцию в VS2010. Когда я использую «шаг в» в окне дизассемблирования в коде вызова, он просто переходит, и я никогда не вижу разобранную функцию. Я попытался перейти по адресу исполняемой памяти в окне разборки или добавить точку останова по этому адресу, но Visual Studio жалуется, что память не является исполняемой. Я также попытался сгенерировать инструкцию «int 3», но она приводит к тому, что мое приложение завершает работу без предупреждения (как если бы вызывался Environment.Exit
). Я сделал простую тестовую программу на C ++, которая использует ту же технику для генерации функции и ее вызова, и я могу войти в нее без проблем.
Как мне перейти к встроенной функции, сгенерированной в выделенном фрагменте исполняемой памяти в проекте .NET Visual Studio? Что-нибудь мешает этому быть возможным? (У меня отключена опция «просто мой код»)