Archivo de la etiqueta: elguille.info

El blog está en un nuevo hosting

Y no sé si falla la base de datos o qué… pero aunque están, los bloques predefinidos no aparecen, ni las categorías, etc. y eso que todo se usa a través de una base de datos… en fin… al WordPress le queda aún cosas básicas que solucionar… 😉

Aún no está el certificado para usar «correctamente» el HTTPS, pero… todo se andará…

Nos vemos.
Guillermo

Adiós Xamarin.Forms, bienvenido .NET MAUI

Pues eso… en el anuncio de Visual Studio 2022 (disponible en versiones preview a partir de este verano) se avisa de que .NET MAUI será la forma de crear aplicaciones para móviles y Web multiplataforma.

Si quieres puedes ver el código (e incluso instalarlo) de .NET MAUI usando el enlace que te he puesto antes, que te llevará al proyecto en GitHub.

Por ahora no lo he probado… pero lo probaré y seguramente te comentaré cosas sobre este nuevo entorno de desarrollo (en realidad no es un entorno, pero para que nos entendamos, ya que se utiliza desde Visual Studio).

Nos vemos.
Guillermo

Detectar por código C# o Visual Basic si una página ASP.NET se muestra en un móvil

Pues eso… aunque he leído por ahí que no es conveniente detectar si se está navegando en un dispositivo móvil… eso era porque lo hacía con código duro (hard-code) es decir, detectar según el valor devuelto por userAgent de window.navigator, que sí, que puede producir resultados no deseados… pero… si usas Request.Browser.IsMobileDevice la cosa cambia.

Y hacer esa comprobación es bien simple.
¿Dónde hacerla?
En cualquier parte del código «script» de tu página ASP.NET (de .NET Framework), ya sea que estés usando Visual Basic o C# (o incluso otros lenguajes que soporten las páginas web asp.net de .net framework).

Un par de ejemplos, por favor

Esta es una página .aspx con código para C#:

<%@ Page Language="C#" AutoEventWireup="true" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Browser.IsMobileDevice)
        {
            LabelDesktop.Visible = false;
            LabelMobile.Visible = true;
        }
        else
        {
            LabelDesktop.Visible = true;
            LabelMobile.Visible = false;
        }
    }
</script>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body style="font-family:Consolas">
    <form id="form1" runat="server">
        <div>
            <asp:Label runat="server" ID="LabelMobile"  Visible="false"
                Font-Size="xx-Large" Font-Bold="true"
                Text="Estas viendo esto en el navegador de un dispositivo móvil." />
            <asp:Label runat="server" ID="LabelDesktop"  Visible="false"
                Font-Size="xx-Large" Font-Bold="true"
                Text="Estas viendo esto en el navegador de escritorio." />
        </div>
    </form>
</body>
</html>

Esta es una página .aspx con código para Visual Basic:

<%@ Page Language="VB" AutoEventWireup="true"  %>

<script runat="server">
    Protected Sub Page_Load(sender As Object, e As EventArgs)
        If Request.Browser.IsMobileDevice Then
            LabelDesktop.Visible = False
            LabelMobile.Visible = True
        Else
            LabelDesktop.Visible = True
            LabelMobile.Visible = False
        End If
    End Sub
</script>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body style="font-family:Consolas">
    <form id="form1" runat="server">
        <div>
            <asp:Label runat="server" ID="LabelMobile"  Visible="false"
                Font-Size="xx-Large" Font-Bold="true"
                Text="Estas viendo esto en el navegador de un dispositivo móvil." />
            <asp:Label runat="server" ID="LabelDesktop"  Visible="false"
                Font-Size="xx-Large" Font-Bold="true"
                Text="Estas viendo esto en el navegador de escritorio." />
        </div>
    </form>
</body>
</html>

Nota:
Puedes tener las dos páginas en una misma aplicación o proyecto WEB de Visual Studio sin necesidad de hacer nada especial, solo tener las páginas en un sitio que acepte .NET Framework.

A tener en cuenta

Si muestras la páginas en un dispositivo móvil, es posible que el navegador te permita ver la página como «escritorio», en ese caso, el valor que devuelve es escritorio, no que es móvil.
En las siguientes capturas tienes la demostración.
En esas capturas estoy usando el Edge para Android en un Google Pixel 4a.

En la figura 1 estoy mostrando la página versión de Visual Basic en el móvil, que si quieres la puedes probar usando el enlace mostrado (está alojada en mi sitio: elguille.info/WebFormVB.aspx).

Figura 1.

 

En la figura 2 te muestro la versión para C# antes de cambiarla a modo escritorio.
También puedes probarla usando este enlace en mi sitio: elguille.info/WebFormCS.aspx.

Figura 2. Mostrando la página como móvil y queriendo cambiar a versión para ordenador

 

Figura 3. Mostrando la página como si estuviese en escritorio y queriendo cambiar a versión apra sitio móvil.

 

Nota:
También puedes probarlo en el navegador de escritorio usando las herramientas de desarrollador, que en Edge y Chrome se pueden acceder usando Ctrl+Shift+I.
Y desde esas herramientas puedes indicar que se muestre como si fuese en un móvil (ver la figura 4).

Figura 4. Usando las herramientas de desarrollador puedes ver en el escritorio cómo sería usarlo en un móvil… o casi.

Espero que te sea de utilidad 😉

Nos vemos.
Guillermo

Problemas con el Provisioning en las aplicaciones para iOS con Xamarin.Forms creadas con Visual Studio para Windows

Pues eso… Si estás haciendo una aplicación con Xamarin.Forms para iOS (de Apple) y quieres probar el código en un emulador o un dispositivo conectado a tu equipo, debes tener en cuenta que si estás desarrollando con Visual Studio para Mac todo irá bien, pero si estás usando Visual Studio para Windows, simplemente no te funcionará… salvo que antes te funcionase… ahora te lo explico 😉

Aclaro esto último:
Según me cuentan hay un problema con el provisioning (el que se indica en iOS Bundle Signing), es decir, autenticar tu cuenta de Apple Developer (*) con la aplicación, debido a que recientemente Apple ha realizado un cambio que provoca que se bloquee temporalmente las peticiones y se obtenga un error.

También según me cuentan: Es una issue con prioridad alta y están revisándolo.

Así que… esperemos que pronto esté solucionado.

Lo que comenté de salvo que antes te funcionase es porque (también según me cuentan): Si en el PC, previamente se ha utilizado Hot Restart con la cuenta, se tiene en caché lo necesario para evitar alguna petición y por ese motivo, te puede funcionar sin problemas.

 

Capturas de iOS Bundle Signing

Aquí te dejo un par de (o tres) capturas de la opción iOS Bundle Signing en las opciones del proyecto para iOS, tanto en Windows (que es donde da el error) como en un Mac (que no da error y funciona sin problemas).

Figura 1. La firma (autenticación) en Visual Studio para Mac funciona correctamente.

 

Figira 2. Fallo al autenticar con Visual Studio para Windows usando un dispositivo.

 

Figura 3. Fallo al autenticar con Visual Studio para Windows usando el emulador.

 

Y esto es todo, espero que te sea de utilidad.

Cuando esté solucionado intentaré poner una nota en este post de que así es… ¡espero no olvidarme! 😉

Nos vemos.
Guillermo

(*)
Para desarrollar (creo que incluso para probar) aplicaciones de Xamarin.Forms para iOS (Apple) debes tener creada una cuenta de Apple Developer, que a día de hoy cuesta 99€ al año. Esa cuenta se debe usar tanto en Windows como en Mac.

P.S.
Título en inglés:
Provisioning issues in iOS apps with Xamarin.Forms built with Visual Studio for Windows.

Charlas (podcasts) con Luis del Valle Hernández de ProgramarFacil

Pues eso… esto es de hace unos años, del 4 de junio de 2015 concretamente (según me ha dicho Luis, porque yo ya no lo recordaba), y aunque la entrevista/charla se hizo de una vez, él las publicó (en modo podcast, audio) en dos partes.

Pero como las he buscado y no las he encontrado ni en mi sitio (elguille.info) ni en este blog, lo publico ahora aunque sea después de tanto tiempo ya que considero que deben estar «localizables» porque fueron las primeras :-).
Así podrás saber más cosas sobre mí… aunque a fecha de hoy ya hay 4 charlas en YouTube, es conveniente que estos dos podcasts también estén visibles al buscar las charlas o entrevistas que me han hecho.

Así que… aquí tienes los enlaces a estos dos podcasts con la entrevista de Luis del Valle Hernández que me hizo el 4 de junio de 2015:

Charla 1: Primera parte de la charla con El Guille programación .NET

Charla 2: Segunda parte de la charla con El Guille programación .NET

 

Y ya que estamos con los enlaces, te pongo también los 4 de YouTube que me han hecho entre junio de 2020 y abril de 2021 (en plena pandemia del COVID-19):

1- Entrevista a Guillermo Som (elGuille) por Sergio Alejandro Campos para el canal EXCELeINFO (16-jun-2020)

2- Pablo Tilotta entrevista a ElGuille (21-jul-2020)

3- La evolución de .Net, una plática de Héctor de León con «El Guille» (17-nov-2020)

4- SevillaDotNet: Café Virtual con ‘ElGuille’ (07-abr-2021)

 

Nos vemos.
Guillermo

Acompáñame en el café virtual con Marcelo este miércoles 7 de abril

Pues eso… Marcelo de SevillaDotNet me ha invitado a un café virtual el próximo miércoles día 7 de abril a las 18:30 hora de la España peninsular (una hora menos en Canarias), así que… si nos quieres acompañar regístrate y asiste siguiendo este enlace: Café Virtual con Guillermo Som.

Nota del martes 6 de abril
Si quieres, también puedes verlo en directo por YouTube o bien usar este mismo enlace para después de mañana 7 de abril de 2021:

SevillaDotNet: Café Virtual con ‘ElGuille’

 

 

Si quieres ver qué hora es ahora en España (Madrid) sigue el enlace y así sabrás qué hora será en tu país 😉
Me comentan que al pulsar el enlace te muestra la hora en tu ciudad.

Este es el resumen de la charla cafetera 🙂

En este café virtual vamos a charlar con Guillermo Som. Tras tantos años participando y ayudándonos a todos con su sitio elguille.info, probablemente te haya ayudado en algún momento.
Vamos a charlar sobre sus inicios en la informática, sobre el camino que él ha tenido cómo programador, de .NET y su evolución y mucho más.

¿Te unes a nosotros?

¡Te espero!

Nos vemos.
Guillermo

Solucionando problemas varios con Xamarin.Forms para UWP

Pues eso… a raíz de lo que te puse hace un rato (sobre GetExecutingAssembly) que al querer hacer la captura en el proyecto de prueba (Prueba Mobile) para UWP (Universal Windows Platform o Plataforma Universal de Windows), resulta que no me funcionaba… pero como la otra aplicación que estoy haciendo (Reservas Kayak Mobile) para kayakmaro.com si que iba la versión para UWP, pues hice ahí la captura.

La cuestión es que tenía 4 errores, uno de ellos decía algo así:
type universe cannot resolve assembly, concretamente señalaba a una de las DLL que utilizo en el proyecto que usan las versiones de Android, UWP e iOS (bueno, esta última no, ya que he desistido en crear proyectos para iOS porque ni usando un Mac de forma remota lo compila).

El error concreto es (sin indicar el nombre de la DLL ni resto de información):
Cannot resolve Assembly or Windows Metadata file ‘Type universe cannot resolve assembly:

El proyecto ese que te comento que vale para las distintas versiones de la aplciación es una DLL (biblioteca de clases de .NET Standard 2.0) de forma que se pueda usar en distintas plataformas.
Esa DLL la tienes que tener referenciada en cada proyecto (de cada plataforma) y así es como funciona esto con Xamarin.Forms.
En mi caso, la DLL de .NET Standard se llama Prueba Mobile y la aplicación para Android es: Prueba Mobile.Android, y sin necesidad de poner mucha imaginación sabrás que la de UWP se llama Prueba Mobile.UWP.

Ese proyecto (el de la DLL) tiene referencias a otros dos proyectos, también creados para .NET Standard 2.0, en estos dos casos, los he hecho con Visual Basic para utilizar (con algunos cambios en cierto código) el código que ya tenía hecho y que no era plan de volver a hacerlo de nuevo y en C#, que es el lenguaje que usan las aplicaciones de Xamarin.Forms.

Pues bien, el error ese de error type universe cannot resolve assembly me apuntaba a una de esas dos DLL que hace referencia la DLL principal (el nombre da lo mismo), y según parece, al no encontrar esa DLL generaba otros errores, concretamente que no podía copiar ciertos ficheros de la carpeta obj\x86\Debug porque no existían.
Y ahí se quedaba.

Los erores de que no podía copiar ficheros de la carpeta obj\x86\Debug eran:
Could not copy the file «obj\x86\Debug\MainPage.xbf» because it was not found.
Could not copy the file «obj\x86\Debug\App.xbf» because it was not found.
Could not copy the file «obj\x86\Debug\Prueba Mobile.UWP.xr.xml» because it was not found.

Así que… me pongo a buscar en internet y me encuentro con varios consejos (algunos copiados de otros previamente hallados, por lo que supongo que el que lo decía, ni lo había comprobado), pero esos consejos (o casi todos) hacían referencia a .NET Framework y «el target framework» o a hacer referencias a paquetes NuGet, pero no eran esos los casos… ya que dicha DLL ni está creada con .NET Framework ni está en un paquete de NuGet, aún así… lo intenté… pero sin resultados, al menos con lo de los paquetes NuGet, ya que lo del target framework, como que no… en fin…

Por probar, copié el proyecto para UWP del otro proyecto al de prueba (cambiando los espacios de nombres, etc.), pero tampoco.

Que si eliminar el directorio .vs, que si eliminar las carpetas obj y bin, pero nada de nada…

La solución

Al final decidí añadir una referencia en el proyecto para UWP (que en realidad no debería hacer falta) a la DLL que generaba ese error, y… ¡SOLUCIONADO!
¡MANDA COHONES!

Repasando los errores

Y para ser más concreto, he vuelto a poner todo como estaba antes de solucionarlo, con idea de poder hacer capturas y ponerte la descripción exacta de los errores.

En realidad lo que he tenido que hacer es quitar la referencia a la DLL y eliminar las carpetas obj y bin del proyecto para UWP.

Esta es la captura de los errores de Visual Studio (pincha en la imagen para agrandar):

Figura 1. Los errores en Visual Studio.

Y esta captura (figura 2) tiene el proyecto para UWP con la referencia (realmente no necesaria) a la DLL que no puede resolver, hecho esto… todo funciona bien.

Figura 2. Las propiedades del proyecto con la referencia a la DLL «fatídica».

Te he dicho antes que realmente no necesaria (añadir la referencia al proyecto UWP) porque en realidad ese proyecto no utiliza esa DLL, y si la utiliza es a través de la DLL Prueba Mobile, que como puedes ver en la figura 3 tiene su propia referencia a MKNDatos, ya que desde el proyecto Prueba Mobile sí que se utilizan las clases de MKNDatos.

Figura 3. Los proyectos referenciados en Prueba Mobile.

Lo que he buscado en la red (en Google)

Aquí tienes el enlace (unod e ellos) que he usado para hacer la búsqueda en Google:

https://www.google.es/search?q=type+universe+cannot+resolve+assembly

Aunque en la figura 1 no se ve, originalmente me dio el XamlCompiler error WMC106 e hice esta búsqueda:

XamlCompiler error WMC1006

Y esto es todo amigo. Espero que, como de costumbre, te sea de utilidad 😉

Nos vemos.
Guillermo

Mejorar el rendimiento al usar GetExecutingAssembly

Pues eso… ya te lo comenté hace unos meses, aunque estaba escondido en las novedades de gsNotasNET.Android v2.0.0.33, y era porque me daba error (sin avisar, para más señas) a la hora de usar la forma recomendada de usar Assembly.GetExecutingAssembly.

En esa ocasión me daba error la aplicación de Xamarin.Forms y sin saber porqué… Pero la he vuelto a probar y por ahora, al menos en el IDE de Visual Studio 2019 va bien.
De todas formas, ya sabes si usas lo que te voy a explicar aquí, y ves que la aplicación casca, ya sabes porqué es.

La documentación (en inglés) dice esto:

For performance reasons, you should call this method only when you do not know at design time what assembly is currently executing. The recommended way to retrieve an Assembly object that represents the current assembly is to use the Type.Assembly property of a type found in the assembly.

Que en el idioma actualizado de Cervantes viene a decir esto (según Google Translator):

Por motivos de rendimiento, debe llamar a este método solo cuando no sepa en tiempo de diseño qué ensamblado se está ejecutando actualmente. La forma recomendada de recuperar un objeto Ensamblado que representa el ensamblado actual es usar la propiedad Type.Assembly de un tipo que se encuentra en el ensamblado.

Aquí te voy a poner el código (tanto de Visual Basic como de C#) para usar esta forma recomendada de asignar un ensamblado (de la clase System.Reflection.Assembly).

Este código está en bibliotecas (proyectos del tipo Class Library) para usar con .NET Standard 2.0 (de esta forma los ensamblados se podrán usar tanto en .NET Core como en .NET Framework).

Ejemplo para C#

public static string VersionDLL()
{
    var ensamblado = typeof(AboutViewModel).Assembly;
    var fvi = FileVersionInfo.GetVersionInfo(ensamblado.Location);
    // FileDescription en realidad muestra (o eso parece) lo mismo de ProductName
    var s = $"{fvi.ProductName} v{fvi.ProductVersion} ({fvi.FileVersion})" + 
        $"\r\n{fvi.Comments}";

    return s;
}

Ejemplo para Visual Basic

Public Function VersionDLL() As String
    Dim ensamblado = GetType(DatosMostrar).Assembly
    Dim fvi = FileVersionInfo.GetVersionInfo(ensamblado.Location)
    ' FileDescription en realidad muestra (o eso parece) lo mismo de ProductName
    Dim s = $"{fvi.ProductName} v{fvi.ProductVersion} ({fvi.FileVersion})" &
        $"{vbCrLf}{fvi.Comments}"

    Return s
End Function

Ese código mostrará la versión del ensamblado, la versión del fichero y la descripción, aunque en realidad a la propiedad a la que tienes que acceder es a Comments, ya que FileDesciption muestra lo mismo que ProductName.

Y aquí tienes una captura para la aplicación de Android con los comentarios de las 3 bibliotecas que estoy usando, 2 de ellas escritas con Visual Basic y la tercera (la que le da funcionalidad visual a la aplicación está escrita en C#).

Figura 1. Captura en el emulador de Android.
Figura 1. Captura en el emulador de Android.

Y esta otra captura es de la aplicación en el emulador (local) de UWP (Universal Windows Platform) pero con la aplicación real. Aunque en modo depuración.

Figura 2. Captura en el (emulador) de UWP.
Figura 2. Captura en el (emulador) de UWP.

Espero que te sea de utilidad… Esa es siempre la idea…

Nos vemos.
Guillermo

P.S.
El puñetero Jetpack agrega código (de más) a las imágenes y cuando estas se muestran desde www.elguille.info, simplemente no se ven… pero… puedes pulsar en el sitio (en blanco) en el que está la imagen y te la mostrará…
Lo mismo quito el Jetpack, que, aparte del «bloque» Markdown y el poder publicar en twitter y mi sitio de facebook, no me sirve de mucho…

Respuesta de Microsoft a la petición de seguir añadiendo características a Visual Basic

Esto es solo para que aparezca en las entradas recientes.

El comentario de hoy 8 de marzo de 2021 está en este enlace.

Por cierto, la petición ya no se puede votar, porque la han cerrado, pero se pueden añadir comentarios… 😉

#evolveVB #evolucionarVB

Nos vemos.
Guillermo

Nuevas ‘versiones’ de Visual Studio 2019

Pues eso… con fecha de anteayer 2 de marzo, hay nuevas versiones de Visual Studio 2019, tanto para la versión final: v16.9.0 como para la preview: v16.10 Preview 1.0.

Este es un extracto de las novedades de .NET Productivity de la versión 16.9.0:
He resaltado las que, a mí me, parecen más interesantes.

.NET Productivity (versión final v16.9.0)

  • There is now IntelliSense completion for preprocessor symbols.
  • Solution Explorer now displays the new .NET 5.0 Source Generators.
  • Go To All won’t display duplicate results across netcoreapp3.1 and netcoreapp2.0.
  • Quick Info now displays compiler warning IDs or numbers for suppressions.
  • Using directives will now automatically get added when copying and pasting types to a new file.
  • IntelliSense completion will now automatically insert a semicolon as a commit character for object creation and method completion.
  • Semantic colorization for C# 9.0 records.
  • Refactoring that removes unnecessary discards.
  • Refactoring that converts a verbatim and regular string to an interpolated string preserving curly braces that were intended to go in the output.
  • Code fix in Visual Basic that removes the shared keyword when you convert methods that are shared to a module.
  • A refactoring that suggests using new(…) in non-contentious scenarios
  • A code fix that removes redundant equality expressions for both C# and Visual Basic
  • The .NET Code Style (IDE) analyzers can now be enforced on build
  • The Syntax Visualizer shows the current foreground color for enhanced colors
  • A new tooltip when hovering over the diagnostic ID for pragma warnings
  • When you type the return key from within a comment the new line is now automatically commented out
  • Inline parameter name hints enhancements
  • .NET Core Debugging with WSL 2

Para la versión preview… pues… mejor lo miras en la página de información publicada por la gente de Microsoft.

Nos vemos.
Guillermo