Error en proyectos gRPC al usar un nombre de usuario de Windows con espacios o caracteres especiales
C:\Users\<Tu nombre>
:De hecho, llevo ya varios encontronazos de este tipo en los últimos meses (por ejemplo, con Anaconda o con el SDK de Android para Windows), y el último lo he tenido al intentar utilizar las herramientas de Protobuf para la creación de servicios gRPC que, como sabéis, es una de las novedades incluidas en .NET Core 3.
Aunque el problema lo he encontrado trabajando con Visual Studio, ciertamente este IDE tiene poco que decir al respecto; ocurre lo mismo usando línea de comandos o cualquier otro entorno que se base en el tooling oficial de gRPC para .NET.
Aunque hasta ahora he podido convivir pacíficamente con este problema (básicamente, no añadiendo controles al Toolbox ;-)), hace unos días decidí dedicar un rato a solucionarlo.
En primer lugar, dado que el casque no mostraba ningún mensaje de error previo, he acudido al visor de eventos de Windows, encontrándome con el siguiente mensaje:
.NET Runtime version 2.0.50727.3603 - Error grave de motor de ejecución (7A036050) (80131506)Afortunadamente, es una pista suficiente para dar con la solución. Googleando un poco los códigos de error 7A036050 y 80131506, he dado con el hotfix KB963676, que es posible descargar desde Microsoft Connect.
Una vez instalado el software apropiado para nuestra plataforma (x86, x64…) y reiniciado el equipo, todo ha vuelto a la normalidad.
Y es que a veces bastan unos minutos para eliminar esos pequeños y molestos inconvenientes que nos hacen menos productivos. Lo que es la procrastinación ;-)
Publicado en: Variable not found
Twitteado en: twitter.com/jmaguilar
Facebookeado en: facebook.com/variablenotfound
TextBoxFor()
?Vamos a verlo en detalle. Partimos de una entidad del Modelo como la siguiente:
Persona
:FechaNacimiento
, podremos ver que contiene un parámetro extraño:Durante mucho tiempo no me ha llamado la atención probablemente por la costumbre de verlo en llamadas al helper
TextBox()
, donde el segundo parámetro se utilizaba para especificar el valor por defecto del <input>
. Además, dado que la edición de fechas suele realizarse de forma algo más seria (en breve hablaremos de eso por aquí) y el código generado suele eliminarse, tampoco me había fijado demasiado.Sin embargo, en cuanto observas un poco las distintas sobrecargas de TextBoxFor()
, es fácil darse cuenta de que esta llamada no es correcta. De hecho, si observamos la porción del código fuente HTML generado relativa a la edición de esta propiedad, nos encontraremos con esto:Efectivamente, el atributo extraño de la etiqueta
<input>
no es más que la propiedad Length de la cadena que estamos pasando a TextBoxFor
en su segundo parámetro, reservado en la sobrecarga de TextBoxFor que encaja con la llamada para especificar los atributos HTML personalizados:public static MvcHtmlString TextBoxFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> expression,
Object htmlAttributes
)
Curiosamente, el
TextBoxFor()
sólo es generado así en las vistas de edición (Edit), y sobre propiedades de tipo DateTime
, decimal
y double
; en las vistas de creación (Create) no ocurre este problema, ni con otros tipos de datos.Pero bueno, ya que tenemos el destornillador en la mano, cuesta muy poco trabajo dejar las cosas en su sitio ;-). Como vimos en otra ocasión, el código de las vistas que genera Visual Studio está basado en plantillas T4, y es realmente sencillo modificarlo, así que vamos a ello.
En primer lugar, acudimos a la carpeta del IDE donde se almacenan estas plantillas:
- (IDE)\Common7\IDE\ItemTemplates\CSharp\Web\MVC 2\CodeTemplates\AddView
A continuación hacemos una copia de seguridad de la plantilla llamada Edit.tt (que más vale prevenir…), la abrimos con cualquier editor de texto y buscamos en su la cadena “TextBoxFor”, que encontraremos en una porción de código como la siguiente:
<#= property.Value #>
, que es la que se encarga de emitir los atributos incorrectos. De hecho, sería simplemente dejar la línea tal y como ésta aparece en la plantilla de creación (Create.tt):Publicado en: Variable not found.
Publicado por José M. Aguilar a las 11:38 p. m.
Etiquetas: asp.net, aspnetmvc, desarrollo, error, trucos
Y la verdad, es uno de esos casos en los que no sabes qué hacer: recompilas, limpias la solución, abres y cierras el IDE… pero nada, cuando le da por ahí, no hay forma de hacerlo entrar en razón:
Como ya habría corregido el problema en el momento de escribir este post y no pude reproducirlo para capturar la ventana, os muestro cómo luce en su versión en inglés ;-)
Buscando un poco de información, parece ser que se trata de un problema que aparece al editar el archivo .aspx mientras se está depurando la página, siguiendo una secuencia determinada.
Una de las formas de solucionarlo es un poco bestia, pero funciona (al menos en VS 2008): basta con eliminar el archivo xx.designer.cs indicado por el error (previo backup, por si acaso, aunque hasta ahora no me ha hecho falta nunca ;-)) y forzar al entorno a que lo genere de nuevo, pulsando el botón derecho del ratón sobre el archivo .aspx y seleccionando la opción “Convertir en aplicación web” que habrá aparecido en el mismo.
De momento no le he visto contraindicaciones, y estoy de lo más contento :-)
Publicado en: Variable not found.
Publicado por José M. Aguilar a las 11:48 p. m.
Etiquetas: error, herramientas, trucos, vs2005, vs2008