viernes, 14 de junio de 2013

ClickOnce: There was an error during installation + file:///xxx.vsto did not succeed.

Error al instalar add-in de excel con ClickOnce:



Introducción:

Tenemos un add-in para excel el cual se instala con clickonce. El instalador está publicado en internet, con lo cual el usuario se baja el setup.exe, el cual a su vez determina si debe bajarse el resto de los archivos si es que se instala por primera vez o no.

Problema:

El error es que intenta buscar el archivo .vsto en el mismo lugar donde esta el setup.exe, cuando en realidad debería bajarlo de la URL de instalación.

Nuestro proyecto está manejado por Team Foundation Server y tenemos automatizado el proceso de publicación (publish) desde el TFS, con lo cual con cada check-in se dispara un publish. Para ello tenemos dos campos personalizados donde ponemos el Publish Directory (donde iran los archivos del instalador) y el Publish URL (url publica donde se podrá descargar el instalador). Nuestro proceso reemplaza los path configurados en el archivo de proyecto con los path configurados en los campos personalizados del build template.

El problema se daba que al no poner nada en el proyecto para el publish URL, nuestro proceso no tenía un string para reemplazar y por lo tanto ese string quedaba vacío, entonces clickonce cuando buscaba los archivos complementarios al instalador, al no tener publish url, lo hacía en el mismo directorio desde donde se corría el TFS.

Solución:

La solución fue poner cualquier URL en el PublishURL del proyecto para que nuestro proceso de build tuviera con que reemplazar.



martes, 11 de junio de 2013

Firmar dlls o librerias de terceros en .net

Firmar dlls o librerias de terceros en .net

Escenario: 

Queremos firmar nuestras dlls con una key con extensión PFX (Personal Information Exchange; strong name key protegida por contraseña) y hacemos uso de librerías de terceros, que no están firmadas. Sabemos que al querer firmar nuestras dlls, cuando compilamos, el compilador de Visual Studio nos exige que todas las dlls del proyecto estén firmadas (incluidas las de terceros). Tenemos tres opciones: 

  1. Pedirle a los que crearon la dll que nos manden una version firmada con nuestra key.
  2. Si es open source, bajarnos el proyecto y firmarlo nosotros con nuestra key.
  3. Firmar las dlls sin tener que bajarnos el proyecto con técnicas de ingeniería inversa.
Voy a explicar la opción 3, como firmar las dlls teniendo solo el assembly (archivo .dll).

Solución:

Por ejemplo supondremos que la librería de terceros es un componente para guardar mensajes de error de nuestra applicación (un logger) y se llama ThirdPartyLogger.dll y también supondremos que la key que tenemos se llama MyKey.pfx.

Vamos a utilizar la consola de comando que viene con las herramientas de desarrollador de visual studio (developer command prompt).

Utilizaremos una herramienta llamada ildasm para desensamblar la librería y crear un archivo .il y .resources. En nuestra consola, y parados en la carpeta donde se encuentra la dll ejecutamos:

ildasm /all /out=ThirdPartyLogger.il  ThirdPartyLogger.dll

Luego utilizaremos la herramienta ilasm para reensamblarla, pero esta vez pasandole nuestra key. Si tenemos una key .pfx, ilasm nos pide una key .snk, asique primero extraemos la parte pública de la key del archivo pfx con la herramienta SN y creamos una con extensión .snk pasandole la parte publica de nuestra key:

sn -p MiKey.pfx MiKey.snk

luego ensamblamos la dll y la firmamos con nuestra key .snk (esto se llama delay-sign):

ilasm /dll /key=MiKey.snk ThirdPartyLogger.il  

Finalmente re-firmamos la librería con nuestra clave en archivo .pfx (full-sign):

sn –R ThirdPartyLogger.dll MiKey.pfx

Para verificar que todo salió bien y la librería quedó correctamente firmada:

sn.exe -v ThirdPartyLogger.dll

Referencias:

http://ianpicknell.blogspot.com.ar/2009/12/adding-strong-name-to-third-party.html