2008-09-29 15 views
31

Tengo varias aplicaciones .NET Windows Forms que estoy preparando para convertir en un escenario de implementación de ClickOnce/cliente inteligente. He leído los tutoriales sobre este tema, pero ¿hay trampas o "trampas" que deba conocer?Errores/errores del despliegue de ClickOnce/Smart-Client en .NET

Existen varias aplicaciones secundarias que se utilizan de vez en cuando, pero la aplicación principal está en C#, funciona 24/7, es bastante grande, pero solo cambia cada pocas semanas. También escribe en un archivo de registro localmente y habla con dispositivos de hardware locales.

+0

cerradas como 'no constructiva' - sin embargo, las respuestas a esta pregunta fueron extremadamente útil para mí ...al decidir no utilizar la implementación de ClickOnce;) –

+0

He leído a muchas personas quejándose de clickonce, las cosas han cambiado desde entonces, no dejes que estas respuestas te intimiden, es fácil de configurar y tiene buenas ventajas – meda

Respuesta

12

Éstos son algunos de los que tengo conocimiento.

  1. No se puede poner un icono en el escritorio. Ahora puede. No se puede instalar para todos los usuarios.

  2. Necesito pasar por aros para mover la implementación a un servidor diferente. No es un problema si se está desarrollando internamente, y los usuarios pueden ver el servidor en el que se está publicando o si se está implementando en la web pública, pero no es bueno si necesita implementarse en varios sitios de clientes de forma independiente.

  3. Desde .NET 3.5 SP1 ya no es necesario que firme el manifiesto de implementación, lo que hace que sea mucho más fácil mover implementaciones a nuevos servidores.

  4. No puedo instalar ensamblajes en el GAC. Puede evitar esto creando paquetes de instalación regulares que son requisitos previos de la aplicación ClickOnce.

+0

No se puede cambiar la clave de firma caducada (sin reinstalar) a menos que esté en .NET 3.5 SP1. –

+0

En realidad, PUEDE moverlo a un servidor diferente simplemente publicándolo con una nueva URL de actualización (vea http://robindotnet.wordpress.com/2010/01/17/how-to-move-a-clickonce-deployment/) Y puede instalar ensambles en el GAC al ponerlos en un paquete de configuración e implementación y desplegarlos como un requisito previo. – RobinDotNet

+0

@RobinDotNet No es exactamente fácil de publicar desde nuestro entorno de construcción directamente al servidor interno de múltiples clientes. De todos modos, .net3.5 sp1 solucionó todos mis problemas eliminando el requisito de firma. –

4

Uno de los escollos con ClickOnce es el hecho de que no se puede instalar en el GAC. Este es un problema si desea instalar varias aplicaciones que comparten archivos DLL. Cada aplicación requerirá una copia local de los archivos DLL. Además, las instalaciones de múltiples usuarios están fuera. Ver the list comparing Window Installer to ClickOnce.

+0

Si los dll tienen un nombre fuerte, ClickOnce los almacena en caché. Por lo tanto, si tiene varias aplicaciones que usan el mismo dll (tenemos varias, incluido log4net), ClickOnce solo conservará una copia en el caché. – RobinDotNet

6

Teníamos una aplicación que íbamos a implementar como una aplicación ClickOnce. Necesitábamos que el usuario pudiera modificar algunas configuraciones en la instalación (como la ruta de implementación: TI quiere servir los archivos desde su red compartida, desconocidos en tiempo de compilación). Cuando cambia alguno de los archivos en su despliegue, necesita volver a calcular todos los hash y volver a firmar todo. Por lo tanto, si esta solución es interna, es posible que no tenga problemas para pasar un certificado de firma, pero si esto es para clientes, deberá diseñar una solución elegante para eludir este problema.

He escuchado rumores desde algún lugar dentro de las entrañas de los internets que una versión futura de ClickOnce eliminará parte de este dolor de cabeza.

+1

Espero que los rumores que escuchas sean correctos ... ¡este es un gran problema para nosotros! – Aaron

3

Hay muchas cosas que no puede hacer con las aplicaciones ClickOnce, como instalar un acceso directo al escritorio del usuario o tener alguna pregunta sobre dónde se instala la aplicación. Para algunas personas estos son tratos de acuerdo.

También ha pasado un tiempo desde que lo usé, pero hay una forma especial que puede usar para descubrir y mostrar el número de versión/compilación ClickOnce, que es independiente del número de versión/compilación de la aplicación. Tienes que hacer un try/catch y si el número de versión/build de ClickOnce arroja una excepción, la aplicación no se está ejecutando como una aplicación desplegada ClickOnce (es decir, se está ejecutando como una aplicación compilada regularmente o desde Visual Studio).

Para una aplicación que es simple (es decir, no Microsoft Word, sino más bien una aplicación rápida y sucia para hacer algo) y necesita una gran cantidad de implementación regular, ClickOnce es genial. Pero en lugar que rápidamente golpeó la pared de "oh, esto no se puede hacer mediante ClickOnce, elija MSI o algo más).

+3

En lugar de usar Try/Catch mientras intenta obtener el número de versión implementado, envuélvalo en "Si se ejecuta System.Deployment.Application.Deployment.IsNetwork Then ...". Mucho más limpio. Si se implementa en red, puede obtener la versión. Si no, no puedes. Easy-peasy :) –

3

Vas a tener menos acceso al sistema que no sea su aplicación normal .NET.

Esto se debe a que obtendrá un nivel de confianza inferior. Más de eso en .NET Framework Developer's Guide: ClickOnce Deployment and Security.

Mi mayor problema con eso es que no es posible cifrar secciones de su archivo de configuración con la clave del equipo, porque no lo hace tener el acceso a esa clave (cuando lo piense, tiene sentido proteger esa clave).

+2

Hmm, no estoy seguro ... puede solicitar un nivel de confianza más alto, el usuario puede obtener un cuadro de diálogo de advertencia. Puede cifrar las secciones del archivo de configuración en el código en la primera ejecución, pero no durante la implementación, porque esa es la clave del equipo de implementación, no del cliente, que el cliente no puede leer. –

+0

Correcto, pero para descifrarlo siempre debe tener un nivel de confianza más alto ... –

3

En caso de que alguien se refiere a esto en una búsqueda, se han encontrado muchos clientes interesados ​​en la falta de seguridad '' distribuir su aplicación. La aplicación debe estar disponible en una ubicación pública, sin autenticación, para que pueda verificar si hay actualizaciones. La única excepción es si tiene autenticación de Windows NT. Creo que Securing ClickOnce Applications explica a qué me refiero.

Los iconos de escritorio son bastante triviales para hacer a través de código, y como se mencionó, con 3.5 SP1, horneados - por lo que ya no es un problema.

todavía hay un error no fijado con el XMLSerializer - no quede desplegado correctamente en algunos casos. Una solución fácil es agregar manualmente este archivo a la implementación. PITA, pero es bastante fácil ... Puede ser sorprendente cuando en la implantación de repente falla aunque ...

9
  • Cuando se implementan las actualizaciones, la incorporada en el diálogo hará que parezca como si toda la aplicación está siendo vuelto a descargar. De hecho, solo se están descargando las DLL cambiadas, y la barra de progreso que se muestra es engañosa/errónea. No pierda el tiempo tratando de descubrir por qué todas las asambleas se están redistribuyendo solo para descubrir que en realidad no lo están. No es que haya hecho eso ni nada.
  • Cuando el certificado que utilizó para firmar el manifiesto de implementación original caduca y se le emite una nueva, usted se encontrará con un mundo de dolor (los clientes toda la necesidad de desinstalar y volver a instalar). Detalles are at the horse's mouth.
4

No se puede desinstalar de forma silenciosa ClickOnce desplegado aplicaciones. También creo que es imposible agregar parámetros al atajo de inicio.

3

No sabía que SP1 permitió crear el icono del escritorio. Así es como hemos estado haciendo (ahora conocida como "la manera dura"):

  try 
     { 
      string company = string.Empty; 
      string product = string.Empty; 
      if (Attribute.IsDefined(asm, typeof(AssemblyCompanyAttribute))) 
      { 
       AssemblyCompanyAttribute asCompany = (AssemblyCompanyAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyCompanyAttribute)); 
       company = asCompany.Company; 
      } 
      if (Attribute.IsDefined(asm, typeof(AssemblyProductAttribute))) 
      { 
       AssemblyProductAttribute asProduct = (AssemblyProductAttribute)Attribute.GetCustomAttribute(asm, typeof(AssemblyProductAttribute)); 
       product = asProduct.Product; 
      } 
      if (!string.IsNullOrEmpty(company) && !string.IsNullOrEmpty(product)) 
      { 
       string desktopPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), 
        product + ".appref-ms"); 
       string shortcutPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), 
        Path.Combine(company, product + ".appref-ms")); 
       File.Copy(shortcutPath, desktopPath, true); 
      } 
     } 
     catch 
     { 
      // Shortcut could not be created 
     } 
+0

SP1 de qué? .NET 3.5? –

1

No se puede instalar si el cliente está detrás de un proxy que requiere autenticación.

+0

Sí, puedes. Hay una solución. Consulte el final de este hilo: http://social.msdn.microsoft.com/Forums/en/winformssetup/thread/3e9cebad-9630-4bbc-a0ca-0d2f20335454 – RobinDotNet

+0

Hola Robin, si te refieres a tu propia publicación allí, eso está limitado a la actualización, ¿verdad? Mi comentario fue sobre la instalación inicial, que usted mismo dijo que debe hacer por USB/CD, etc. con esta solución. El otro día tropecé con esa publicación mientras trabajaba en este tema, y ​​me emocioné temporalmente como una solución. Pero para una aplicación desplegada en Internet como la nuestra (http://www.qiqqa.com) no ayuda desafortunadamente. – Nik