visual studio one .net clickonce prerequisites

.net - studio - Problemas de implementación de ClickOnce



clickonce visual studio 2017 (6)

Con el fin de crear aplicaciones ClickOnce en nuestro sistema de compilación continua e implementar en varios servidores de prueba, pasé un tiempo con Mage y el artículo Tutorial: Implementación manual de una aplicación ClickOnce .

No estoy seguro de si esto solucionará su segundo problema, pero al menos podría dificultar el proceso de compilación si lo implementa en varios servidores. Si puede distribuir mage.exe (no está seguro si Microsoft lo permite), puede modificar sus manifiestos en el sitio durante la instalación.

Estoy trabajando en un proyecto implementado con ClickOnce, y estoy ejecutando varios problemas.

Hay dos componentes en mi solución de software: un cliente de escritorio que necesita .NET Framework 3.5 para ejecutarse, y un servidor (aplicación ASP.NET ) que enumera los documentos disponibles y proporciona una manera de instalar el cliente de escritorio con ClickOnce.

Mi primer problema es el de los requisitos previos: necesito una forma de instalar el marco 3.5 antes de la instalación del cliente. Visual Studio crea un setup.exe que se encarga de eso, pero para que funcione, debe ejecutarse directamente (en lugar de vincularse al archivo .application ), y la URL implementación debe conocerse al crear ClickOnce. manifiesto.

Así que tengo dos problemas más: aparentemente no hay forma de ejecutar la aplicación cliente con argumentos de cadena de consulta después de instalarla con setup.exe , así que en lugar de tener un servidor que muestre la lista de documentos que se vincula a una URL como "... / client .application? document = doc1 "Solo puedo tener un enlace a setup.exe .

El otro problema es el peor: el servidor está diseñado para ser utilizado en redes privadas relativamente pequeñas y no en un único servidor web. El problema es: no conozco la URL de implementación del cliente ClickOnce en el momento de la compilación, por lo que el setup.exe no se puede ejecutar correctamente cuando se marca la opción "instalar desde un sitio web". Por ahora, la solución es tener un instalador fuera de línea que contenga el setup.exe , los requisitos previos y los archivos de implementación de ClickOnce en un archivo ZIP grande.

Un usuario con la versión de marco adecuada todavía puede usar el enlace .application con una cadena de consulta al documento para instalar / actualizar el cliente y abrir el documento. Un usuario sin el marco recibe un mensaje de error ("Actualización del sistema requerida blablabla 3.5.0.0 blabla GAC"), y tiene que descargar el archivo ZIP, extraerlo en su máquina local y ejecutar el archivo setup.exe para instalar el marco, y entonces el cliente. Y después de eso, tiene que volver a la lista de documentos y usar el enlace para iniciar al cliente con los argumentos adecuados.

No hace falta decir que no estoy muy orgulloso de esta estrategia, que arruina todas las ventajas de implementación de ClickOnce.

¿Es posible deshacerse de la cuestión de los requisitos previos de una manera más elegante? ¿Existe una forma sencilla de modificar la URL de instalación de la aplicación ClickOnce al implementar el servidor en una red (como escribir la URL en un archivo de configuración o algo así)?


Quizás NAnt podría aprovecharse para automatizar el cambio de la URL de implementación. Lo uso para automatizar mis compilaciones ClickOnce y cambiar la versión de compilación del manifiesto. ClickOnce con NAnt describe cómo lo hice.


Si los usuarios están en un dominio, entonces me gustaría que el administrador del sistema .NET 3.5 use las Políticas de grupo / Actualización de Windows o cualquier otra estrategia que se use para administrar los escritorios.

Suena como un problema de medio ambiente. Si la organización es lo suficientemente grande como para tener un administrador del sistema, debería ser responsabilidad de esa persona proporcionar un entorno para que la aplicación se ejecute.

Si la organización no tiene una persona en este rol, entonces creo que está de vuelta en su solución manual. Además, hacerlo manualmente no necesariamente rompe ''todas las ventajas de ClickOnce'' ... Las ventajas de ClickOnce es que puede modificar el cliente, volver a publicar y las máquinas cliente se actualizarán automáticamente ...

Supongo que la otra opción es escribir un script que obtenga e instale .NET 3.5 y luego instale la aplicación, no he hecho esto antes ... Estoy razonablemente seguro de que funcionaría ... En realidad, podría implementar un script de inicio a través de políticas de grupo que también obtiene .NET 3.5, eso sería muy simple.


Tal vez una solución sea:

Use PublishUrl = http: // clickonce / is / kinda / cool y en la computadora cliente modifique el archivo de hosts de Windows ubicado en
% windir% / system32 / drivers / etc / hosts y dirija el clic del host una vez a la dirección IP fija del servidor .

Tal vez ClickOnce debería tener una opción para detectar el servidor desde donde se descargó la aplicación; Si alguien sabe por favor publicar aquí;


También he estado tratando de resolver el problema "No conozco la URL de implementación del cliente Clickonce en el momento de la compilación".

Lo mejor que puedo hacer (acabo de empezar a escribirlo, así que esto todavía es una especulación) es escribir una utilidad que el usuario final ejecutará y que establecerá el despliegueURL. Esto parece ser posible en .NET pero necesita:

  • Leer en el manifiesto con ManifestReader.ReadManifest
  • establecer el DeploymentUrl
  • ManifestWriter.WriteManifest

Luego tienes que volver a firmar el manifiesto utilizando SecurityUtilities.SignFile

El proceso de firma me molesta. O tengo que usar un certificado desechable (que hace que la firma no tenga sentido) o necesito usar un certificado de una CA y luego tengo que distribuir mi contraseña para renunciar al manifiesto (lo cual es una estupidez ya que hace que mi certificado sea inseguro) . Así que parece que me quedo con el usuario viendo "Publisher desconocido" y un signo de exclamación amarillo ...


Segunda pregunta:

Puede usar el destino de publicación de MSBuild en un proyecto, solución o archivo de MSBuild así:

C:/WINDOWS/Microsoft.NET/Framework/v3.5/msbuild.exe "C:/path/foo.vbproj" /target:Publish /property:"PublishUrl=http://clickonce/is/kinda/cool/" /property:"PublishUrl=http://clickonce/is/kinda/cool/"

PublishUrl es la ubicación donde se publicará la aplicación en el IDE. Se inserta en el manifiesto de aplicación ClickOnce si no se especifica la propiedad InstallUrl ni UpdateUrl .

InstallUrl (no se muestra) es la ubicación desde donde los usuarios instalarán la aplicación. Si se especifica, este valor se graba en el programa de arranque setup.exe si la propiedad IsWebBootstrapper está habilitada. También se inserta en el manifiesto de la aplicación si no se especifica UpdateUrl .

Primera pregunta:

Si la respuesta anterior no se ocupa de tus necesidades, entonces me parece que estás enfrentando un problema típico; ¿Cómo se obtiene un ejecutable de Windows (en su caso, .NET Framework 3.5) instalado en varios escritorios? Existen múltiples soluciones como los scripts de Group Policy (GP) o WMI .