C# найдите последний экземпляр, с которым взаимодействовали в стеке вызовов.
Я работаю над личнымC#
проект, в котором я хочу перенаправить потоки консоли на разные входы/выходы для разных экземпляров объектов. Например, у меня есть класс, к которому у меня нет доступа к исходному коду. У меня есть несколько экземпляров , и я хотел бы разделить консольный ввод-вывод пользователей (например, 1 и 2, вывести его на консоль, а для пользователей 2 и 3 записать в файл).
Например, звонки. Я уже понял, как перехватить этот вызов во время выполнения, используя некоторые опасные манипуляции с IL. Но теперь я застрял: как мне узнать, какой экземпляр User вызвал?
- Я не могу использовать такие поля, как UID или Имя, поскольку этот метод должен работать и с другими объектами, которые используют
Console.WriteLine
- Это необходимо сделать во время выполнения (также без изменения сборки, содержащей файлы ).
- У меня нет доступа к исходному коду
User
- У меня нет проблем с использованием
unsafe
или иным образом опасный код
Насколько я понимаю, ссылка на объект должна храниться в стеке как первый параметр последнего кадра, но я не знаю, как получить указатель на ссылку (ни на последний кадр). Но информация должна где-то существовать, поскольку программе необходимо деконструировать кадр после того, как он покинет функцию, верно? Я как бы помню, что всякий раз, когда новый кадр помещается в стек, в конце стека перед добавлением нового кадра помещается указатель кадра, указывающий на верхнюю часть кадра, поэтому, если я доберусь до вершины кадра, текущий кадр, используя указатель текущего кадра, а затем прочитайте указатель последнего кадра перед ним, затем перейдите туда и найдите параметр, на который я мог бы получить ссылку, верно?
Мой вопрос: как бы мне на практике «залезть» на стек? Есть ли другой способ получить ссылку?
(И да, я знаю, что это не было задумано и не является хорошей практикой, но мне действительно нравится именно этот аспект программирования.)