2010-01-16 19 views
15

Actualmente estoy trabajando para hackear mi sistema operativo .NET para que se ejecute sobre MS.NET/Mono (anteriormente se ejecutó solo en hardware) y logré un pequeño inconveniente. Necesito implementar mi propia System.Console que habla con mi infraestructura de servicio, y no puedo encontrar una buena manera de reemplazarla sin 1) no vincularme con mscorlib (sería fantástico hacer), o 2) usar NotQuiteSystem espacio de nombres para mis reemplazos, lo que rompería la compatibilidad.Reemplazando clases en el espacio de nombres del sistema

¿Existe un mecanismo por el cual puedo reemplazar limpiamente las clases del sistema sin hacer una de esas cosas?

Edición: Una idea es utilizar Mono.Cecil para reescribir las referencias a System.Console a Renraku.System.Console o somesuch, pero preferiría trabajar dentro del framework si es posible.

+0

En su problema específico, deseando sólo para implementar un TraceListener y utilizar un Trace.Write? –

+0

@Rubens Farias: Es una buena idea w.r.t. salida, pero no permitirá el enganche de entrada, la configuración de la consola afecta a nuestras consolas reales, etc. –

+1

Según tengo entendido, está tratando de crear un host de máquina virtual, no un sistema operativo. –

Respuesta

4

Usted debe mirar en la herramienta gratuita PostSharp. Le permite cambiar ensamblajes .Net existentes en tiempo de diseño al automatizar la modificación de MSIL.

Consulte this page para obtener más información sobre el tejido en tiempo de compilación en PostSharp. y this page para obtener información sobre el entrelazado en tiempo de carga (se produce en el tiempo de ejecución justo antes de que el ensamblaje se cargue en la memoria).

Para runtime weaving (modificando los métodos existentes en tiempo de ejecución), mira LinFu.

[A excepción de la página]

... se puede utilizar para interceptar LinFu.AOP dinámicamente cualquier método de cualquier tipo, independientemente de si es o no el método se declara virtual o no virtual. También podrá interceptar dinámicamente (e incluso reemplazar) los métodos declarados en tipos sellados, además de cualquier método estático que se declare en ese tipo.

[/ A excepción de la página]

+0

Gracias por la información.No es perfecto para mi caso, pero parece ser lo mejor que haré. –

+0

No hay problema. Espero que haga el truco. –

0

¿Está buscando simplemente redirigir el estándar y el estándar? Si es así, Console.SetIn(TextReader in) y Console.SetOut(TextWriter out) son exactamente lo que estás buscando.

En cuanto a otros métodos, estoy bastante seguro de que todos pasarán por mscorlib en algún momento. Si no puede pagar eso, puede terminar escribiendo su propia clase de consola después de todo.

+0

Necesitamos acceso de nivel inferior a la consola, p. colores, tamaño del búfer, etc. Por lo tanto, debemos ser capaces de reemplazar toda la clase. Parece que la única manera de hacerlo es utilizar Mono.Cecil para reescribir referencias. –

0

No creo que con sus restricciones a un tercero pueda cambiar de system.console. ¿por qué no escribir una nueva clase con lo que quería o buscar un material de código abierto?

No es una alternativa más es el uso de Windows PowerShell, pero creo que también no funcionará en su caso

0

¿qué tal indirecting en los métodos de la consola. Utilizar la reflexión para cargar punteros de función a las funciones que necesita y entonces puede tener un archivo de configuración que proporciona los nombres reales de las funciones que utilizará

Es decir, en su código que llame DoConsoleRead

En el tiempo de carga DoConsoleRead es hecho para apuntar a alguna función arbitraria

0

Creo que se podría hacer usando el nodo Referencias en la hoja Propiedades. Eche un vistazo a este ejemplo: http://www.codeproject.com/KB/mobile/Wm2005Globalization2.aspx. "arregla" una clase en el Framework Compacto, creo que puede hacer que funcione en el marco completo, pero puedo probarlo ahora mismo. (Sin VS en el trabajo)

0

¿Qué tal si ejecuta ROTOR (SSCLI) en su sistema operativo? Allí también tienen el código fuente completo y una abstracción del sistema operativo subyacente http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&displaylang=en

Después de haber pasado algún tiempo en Reflector con MS .NET, todos sabemos que está estrechamente ligada a la API WIN 32, que sólo causaría su sistema operativo para parecerse más a Windows y luego ser un nuevo sistema operativo limpio.

Aparte de eso, la reescritura de referencias parece una opción viable.

+0

ROTOR, estar bajo una licencia de contaminación, sería un serio problema legal si los desarrolladores de Renraku lo tocaran; nos impediría trabajar en nuestro propio tiempo de ejecución y haría que nuestro sistema operativo no sea realmente gratuito. Debido a la arquitectura del sistema operativo, las características específicas de la plataforma (alojada) se aíslan de diferentes servicios, lo que nos permite mantener nuestro propio estilo. Parece que la reescritura de referencias es la mejor manera de hacerlo. –

+0

Cody, he estado investigando más SO administrados. Y ahora veo totalmente tu punto. Parece que personas de mentalidad similar de COSMOS y MOSA tienen los mismos problemas. Me parece que todos deberían estar de acuerdo en trabajar en un solo 'sistema operativo administrado' si desea tener éxito. Hay demasiado trabajo para difundirlo (al menos 3 proyectos). – Rudi

0

¿Qué hay de la sustitución de la clase del sistema en el GAC? Sé Java tiene un interruptor bootclasspath definir la ubicación de la Java "de arranque" clases-java.lang.Object, java.lang.Exception, y así sucesivamente

Cuestiones relacionadas