2011-12-20 15 views
13

Hace poco vi un poco la transmisión en vivo de Ludum Dare de Notch. Usa la característica de acceso rápido de Eclipse extensamente mientras trabaja en su juego. (aquí hay un video de lo que me refiero a http://www.twitch.tv/notch/b/302823358?t=86m30s)¿Es posible editar y continuar en Visual Studio 2010 sin detener la ejecución?

Me gustaría hacer lo mismo con C# y XNA. Afortunadamente, Visual Studio tiene una función Editar y Continuar. Sin embargo, me gustaría editar mi código de representación mientras se está ejecutando en lugar de pausarlo.

¿Puedo configurar Visual Studio para que haga lo mismo? Me di cuenta de que hay una casilla de verificación para Break all processes when one process breaks. ¿Es posible configurar mi ciclo de representación en otro hilo para que el juego siga reproduciéndose mientras realizo un cambio?

+0

¿Le sugiero que lea los valores que desea editar de un archivo, para poder editar el archivo y volver a leerlo cuando lo desee mientras se ejecuta? – Benjamin

+0

Sí, esta es una buena práctica, pero también es bueno poder programar de forma interactiva. Esto generalmente se hace mediante el uso de un lenguaje de scripting. Esperaba que C# pudiera hacer lo que Java puede hacer en esta instancia. Desafortunadamente, parece que alguien tomó una decisión de diseño para bloquear los archivos fuente para que sean de solo lectura durante la ejecución sin pensar en cómo podría ser útil permitir las ediciones. – zfedoran

Respuesta

16

Actualización: Esta respuesta ya está disponible as a video.


He estado luchando para encontrar la manera de hacerlo. Sé que esto no responde tu pregunta exacta. Pero realmente lo que estás buscando es un flujo de trabajo en el que puedas hacer cambios de código con un retraso nulo (o casi nulo), y creo que ya descubrí lo más cercano que puedes obtener con Visual Studio. (Y por lo tanto, evitando un gran esfuerzo de ingeniería y lidiando con proyectos "anormales").

La manera de lograr este flujo de trabajo es en realidad asombrosamente simple, una vez se piensa en ello: teclas

Uso de acceso directo!

La primera forma en que se me ocurrió es utilizar el método normal de edición y continuación para establecer un punto de interrupción. Solo al usar el teclado puede hacer esto considerablemente más rápido. Esto solo funciona con un código que se llama en un bucle (por ejemplo: draw/update). Haga clic en el código que desea modificar, añadir un punto de interrupción (F9), casi inmediatamente se dio en el punto de interrupción, modificar su código, retire la breakoint (F9), y ejecute el código de nuevo (F5).

Esto es bastante bueno. No es necesario que use el mouse para alcanzar el objetivo relativamente pequeño "Añadir punto de corte" en la columna de la izquierda. Pero mueve el foco de entrada al principio de la línea, por lo que generalmente debe usar el mouse nuevamente para corregirlo antes de poder comenzar a editar.

Quiero algo más rápido. Así que se me ocurrió una solución mejor:

De nuevo, usando el teclado: Pulsar Ctrl +Alt +rotura para "romper todo". Esto ingresa al depurador casi al instante, sin tener que preocuparse por establecer un punto de interrupción o si el código que desea modificar se está ejecutando en un bucle. Esto cambiará la ventana del editor y se enfocará en el documento donde se rompe la ejecución, pero puede corregirlo inmediatamente presionando Ctrl + - para "Navegar hacia atrás".

Luego puede hacer sus ediciones y simplemente presione F5 para verlas en acción.Solo debe usar el mouse una vez (o no usarlo) para seleccionar inicialmente dónde desea comenzar a escribir, tal como lo esperaría.

cierto Ctrl +Alt +rotura y Ctrl +- son horribles combinaciones de teclas para algo que desea ser capaz de hacer muy rápidamente. Y sería mejor si hubiera solo una tecla para presionar.

Si tiene Visual Studio completo, probablemente podría convertirlo en una macro o complemento. Express no los tiene, así que lo mejor que puedes hacer es modificar tus enlaces de teclas (Herramientas, Personalizar, Teclado ...) y vincularlo a dos teclas adyacentes, que puedes presionar en sucesión rápida. O use una utilidad macro externa.

Personalmente configuré las dos combinaciones de teclas que se presionarán sucesivamente (no parece necesitar un retraso entre las dos) mediante una macro establecida en un botón de repuesto en mi mouse. Lo cual funciona razonablemente bien, ya que generalmente estoy seleccionando texto al mismo tiempo. También podría agregar una macro de teclado más tarde.

Hasta ahora he identificado dos trampas de menor importancia de este método:

  • Al ejecutar la aplicación de nuevo, Visual Studio le transfiere el enfoque. Sería bueno si mantuviera el foco. Agregar un clic con el botón izquierdo del mouse a mi macro es una solución parcial para volver a editar rápidamente el código.
  • "Navegar hacia atrás" no conserva la selección de texto, solo la posición de intercalación.
+2

Espero que este flujo de trabajo sea más fácil en futuras versiones de Visual Studio. Parece haber un interés creciente en la retroalimentación inmediata y las características de intercambio en caliente. Esta conversación muestra lo que podría ser posible un día: http://vimeo.com/36579366 – zfedoran

+0

Acabo de enterarme de esto. Gracias por esta maravillosa respuesta, Andrew! –

7

le puedo decir cómo, pero ar no va a gustar:

1) ejecutar el ejecutable del juego en una instancia de Visual Studio (Game.exe -> vsInstanceA)

2) código de su código modificable en una DLL independiente, mediante una instancia independiente de visual Studio (modifiable.dll -> vsInstanceB)

* en cuenta que hacer esto le permite compilar su modifiable.dll, haciendo de este modo compilar la comprobación de errores de tiempo, etc. *

... y ahora es donde es difícil llegar ...

3a)game.exe necesita hacer referencia al modifiable.dll. NO el .vcproj, la DLL real

3b) cuando se pulse una "llave mágica" (tener Game.exe mirada de una pulsación de tecla), han Game.exe descargar el modifiable.dll, y vuelva a cargarlo. Puede hacerlo fácilmente a través de las clases Assembly y AppDomain proporcionadas en mscorlib. Por supuesto, esto significa que debe descargar cualquier sistema dependiente en game.exe.

nota, hay una gran cantidad de en esta sección 3b)-agitando la mano, es bastante mucho trabajo, pero bastante sencillo (ejemplo Google: https://www.google.com/search?q=dynamic+load+dll+.net)

... y después de eso, son buenos ir ...

3-alt) algunas otras opciones si 3b) no le conviene:

  • puede invocar msbuild.exe para reconstruir modifiable.dll al pulsar "clave mágica"
  • puede usar los dll del compilador CSharp dinámicamente para volver a compilar cada clase en lugar de modificable.dll

pero por desgracia, en mis 10 años de desarrollo .NET, esta es la única manera, a menos que alguien ha creado un producto de 3 ª parte para hacerlo (IE: hacen lo he mencionado, para usted)

+0

Gracias por tomarse el tiempo para encontrar una "solución" :) – zfedoran

2

Esto puede no ser exactamente lo que está buscando pero es lo que he estado haciendo. Solo arroja un punto de quiebre mientras tu juego se está ejecutando. Una vez que se detiene, puede editar cosas, eliminar el punto de interrupción y luego presionar F5 para continuar.

En su mayor parte, esto le permite editar cosas mientras el juego se está ejecutando y continuar ejecutando el juego después, pero no funciona para todo. No puede agregar o eliminar elementos de nivel de clase y tampoco puede agregar/eliminar funciones enteras o los parámetros. Principalmente, hago esto para probar diferentes números y ecuaciones para cosas más pequeñas que reciben cada actualización.

0

Para responder a la pregunta original "en Visual Studio 2010 sin detener la ejecución?"

No. Para Java hay JRebel que permite esto.

Puedo imaginar rápidamente por qué Microsoft no ha hecho esto - si tiene algún tipo de comité o grupo de personas diseñando cosas - es fácil que incluso una sola persona presente buenos argumentos donde este "software dinámico de actualización"/hotswap se romperá. Es demasiado fácil de derribar. O si continúan con esto, será a través de un "marco empresarial" completamente nuevo que requiere muchos pasos, trabajo y comprensión para llegar a cualquier parte, porque quieren usarlo para escenarios complicados en línea.

Preferiría que hubiera alguna forma simple de hacerlo: tomaré los riesgos y presentaré una gran cantidad de descargos de responsabilidad que indican que si quieres servicios de hotswap que hablan con sistemas externos, entonces necesitas usar ese marco complicado o lo que sea.

El escenario más típico donde esto podría usarse con bajo riesgo es crear prototipos y ajustar algún tipo de motor con un alto costo inicial o más, estudiar el comportamiento si algo funciona en el motor (como las reglas) es defectuoso y para exhibir el error, tienen que pasar muchas cosas y es posible que no encuentres el error siempre. Ese es el caso donde tener esto podría ahorrar semanas de tiempo de depuración, al menos tendría en mi caso.

0

Estoy acostumbrado a trabajar en Java usando IntelliJ Idea + DCEVM (Dynamic Code evolution VM).

Desafortunadamente no he encontrado nada que se acerque a esa configuración en la plataforma Microsoft C#. Realmente apesta y no se puede hacer mucho al respecto.Puede utilizar algunas macros definidas por el usuario, pero aún no puede hacer mucho en el modo Editar y continuar sin reiniciar la sesión de depuración.

Sin embargo, si puede, intente utilizar el .NET Core más nuevo que ofrece una productividad mucho mejor con Dotnet Watch. Aún no es tan rápido como DCEVM pero es mucho mejor que la experiencia tradicional de recarga en caliente VS + .NET. Details here.

Cuestiones relacionadas