Замена классов в системном пространстве имен

В настоящее время я работаю над взломом моей операционной системы .NET, работающей поверх MS.NET/Mono (ранее она запускалась только с голосом), и я попал в маленькую загвоздка. Мне нужно реализовать мою собственную System.Console, которая говорит с моей инфраструктурой обслуживания, и я не могу найти хороший способ ее заменить, не используя 1) не связываясь с mscorlib (это было бы здорово) или 2) Использование NotQuiteSystem пространство имен для моих замещений, которое нарушит совместимость.

Есть ли механизм, с помощью которого я могу чисто заменить классы системы, не делая одну из этих вещей?

Изменить: одна мысль заключается в использовании Mono.Cecil для перезаписи ссылок на System.Console на Renraku.System.Console или что-то вроде этого, но я предпочел бы работать в рамках, если это возможно.

Ответы

Ответ 1

Вы должны заглянуть в бесплатный инструмент PostSharp. Он позволяет изменять существующие сборки .Net во время разработки, автоматизируя модификацию MSIL.

См. эту страницу для получения дополнительной информации о переплетении во время компиляции в PostSharp. и эту страницу для получения информации о ткачестве во время загрузки (происходит во время выполнения перед загрузкой сборки в память).

Для воспроизведения во время выполнения (изменение существующих методов во время выполнения) просмотрите LinFu.

[За исключением страницы]

... вы можете использовать LinFu.AOP для динамического перехвата любого метода на любом типе, независимо от того, объявлен ли этот метод виртуальным или не виртуальным. Вы также сможете динамически перехватывать (и даже заменять) методы, объявленные на закрытых типах, в дополнение к любым статическим методам, объявленным в этом типе.

[/За исключением страницы]

Ответ 2

Вы хотите просто перенаправить стандартное и стандартное? Если да, Console.SetIn(TextReader in) и Console.SetOut(TextWriter out) - это именно то, что вы ищете.

Что касается других методов, я уверен, что они все пройдут через mscorlib в какой-то момент. Если вы не можете этого позволить, вы можете в конечном итоге написать свой собственный класс консоли.

Ответ 3

Я не думаю, что ваши ограничения для третьей стороны вы можете переключиться с system.console. почему бы не написать новый класс с тем, что вы хотели, или искать материал с открытым исходным кодом.

Есть еще одна альтернатива использованию windows powershell, но я думаю, что это также не будет работать в вашем случае

Ответ 4

как насчет косвенности на консольных методах. Используйте рефлексию для загрузки указателей функций на нужные вам функции, а затем вы можете иметь конфигурационный файл, который содержит фактические имена функций, используемых

Т.е. в вашем коде вы вызываете DoConsoleRead

В момент загрузки DoConsoleRead используется для указания на произвольную функцию

Ответ 5

Я думаю, что это можно сделать, используя ссылку node на странице свойств. Взгляните на этот пример: http://www.codeproject.com/KB/mobile/Wm2005Globalization2.aspx. Он "исправляет" класс в Compact Framework, я думаю, вы можете заставить его работать в полной структуре, но я могу проверить его прямо сейчас. (Нет VS на работе)

Ответ 6

Как насчет запуска ROTOR (SSCLI) в вашей ОС? Там у вас также есть полный исходный код и абстракция от базовой ОС http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&displaylang=en

Проведя некоторое время в Reflector с MS.NET, мы все знаем, что он тесно связан с API WIN 32, что приведет только к тому, что ваша ОС будет больше похожа на Windows, а затем на новую чистую ОС.

Кроме того, переписывание ссылок представляется жизнеспособным вариантом.

Ответ 7

Как насчет замены класса System в GAC? Я знаю, что Java имеет переключатель bootclasspath, определяющий расположение классов "bootstrap" Java-java.lang.Object, java.lang.Exception и т.д.