Este rompecabezas de programación está inspirado en otra pregunta que se hizo ayer aquí pero que fue eliminada por el autor ...
El reto:
Cree un binario ejecutable (binario de Windows .EXE o Linux) usando Visual C # (o su IDE favorito de C #) que imprime el siguiente texto en la salida estándar:
Main() is the main method of C# programs!
... sin usar las 4 letras consecutivas PRINCIPALES que aparecen en cualquier archivo fuente!
Notas:
- Si su código fuente contiene el texto
remainder
(por ejemplo), contiene las 4 letras consecutivas PRINCIPALES, sin embargo, si contienemxain
las 4 letras ya no serían consecutivas, pormxain
lo que estaría permitido. No está permitido ejecutar ningún programa que no sea el IDE de C # ni cambiar la configuración del IDE de C # para ejecutar otros programas (pero los que normalmente se ejecutarían, como el compilador de C #).
De lo contrario, simplemente podría decir: "Escribo un programa Pascal usando el IDE de C # e invoco el compilador Pascal en los pasos 'precompilación' de mi proyecto C #".
Esto sería muy simple.
Los usuarios de un IDE que se puede ampliar utilizando "complementos" (o similares) o que tienen editores de archivos binarios incorporados (editores hexadecimales) tendrían una ventaja demasiado grande sobre los usuarios de otros IDE de C #.
Por lo tanto, estas características tampoco deben usarse.
- ¡El uso de otros editores no ASCII (como el editor de la ventana de diálogo) está explícitamente permitido!
- El usuario que formuló la pregunta original propuso utilizar la barra diagonal inversa en los nombres de las funciones de la siguiente manera: como
static void M\u0061in()
esta respuesta ya ha sido leída por otros usuarios, ¡ya no será aceptada! - Un usuario preguntó si se le permitiría simplemente escribir un archivo .EXE en el editor de código fuente y guardar el archivo como ".exe" en lugar de ".cs". Respuesta: Dudo que esto sea posible porque los binarios válidos de Windows y Linux contienen bytes NUL. Sin embargo, si encuentra un binario válido que se puede crear de esta manera, tiene una solución válida.
El nombre de este sitio es "Rompecabezas de programación y código de golf" - este es un "rompecabezas de programación", no "código de golf": el desafío es encontrar una solución que funcione antes que todos los demás usuarios, no encontrar una solución más corta que todos los demás soluciones
¡Por lo tanto, la primera publicación que describe una solución de trabajo gana !
¡Buena suerte!
Por cierto: tengo una solución que funciona bajo Visual C # Express 2010.
fuente
Respuestas:
Ventana interactiva de C #
Abra la ventana interactiva de C # (Ver> Otras ventanas> C # interactivo en Visual Studio 2015). Supongo que no todos los IDE tendrán esto.
Este enfoque ejecuta C # en la Ventana interactiva para crear un exe C # que imprima la cadena deseada sin que el autor escriba
main
. Como beneficio adicional, la IL del exe tampoco contienemain
.Ejecute el siguiente código en la ventana interactiva
Use
Environmnent.CurrentDirectory
para ver dónde se creó el exe. Ejecútelo para observar la salida deseada.IL resultante:
fuente
Aplicación WPF
Crea una nueva aplicación WPF.
Reemplace todas las instancias de
Main
conMeow
Cambiar el nombre
MainWindow.xaml
aMeowWindow.xaml
. Esto cambiará automáticamente el nombreMainWindow.xaml.cs
aMeowWindow.xaml.cs
.En las propiedades del proyecto, cambie el Tipo de salida para
Console Application
que se cree la consola.Agregue escritura de consola para la cadena de salida deseada en su
MeowWindow
constructorCtrl + Shift + F para confirmar que no hay ningún
main
lugar en el directorio de origen.F5 / compilar y ejecutar.
Cómo funciona
Para aplicaciones WPF, Visual Studio genera el
obj\Debug\App.g.cs
que contiene elMain
método. El generadoMain
crea una instancia de su aplicación WPF y la inicia.fuente
Solo como referencia
Mi idea era similar a la segunda idea de "leche":
Encuentre una manera de permitir que el IDE ejecute código y escriba un ejecutable en el disco.
Mencioné explícitamente los archivos binarios de Windows y Linux porque pensé en escribir el archivo binario .EXE usando
System.IO.File.WriteAllBytes()
para que no fuera necesariamente un archivo .NET EXE.Mi problema fue que VS Express 2010 parece no tener una consola interactiva, así que tuve que encontrar un reemplazo para eso. Encontré lo siguiente:
Cree un proyecto DLL con una ventana de diálogo y un control personalizado; compile el proyecto y agregue el control personalizado a la ventana de diálogo. El editor de la ventana de diálogo llamará al código del control personalizado, y en este código puede escribir el archivo .EXE en el disco ...
fuente