domingo, 27 de julio de 2008

Mostrar un Band Object (Add-on) en el Ineternet Explorer y no en el Windows Explorer

Basicamente lo que hice fue poner el siguiente código en el creador del band object:
public BandObject()
{
string name = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
if (name.ToLower()!="iexplore")
{
throw new Exception();
}
InitializeComponent();
}

Si alguien encuentra como hacer para que directamente no se cargue la dll bienvenida sea esa solución, porque hasta ahora no lo he encontrado :P

Se que para los BHO se le pone en el registry un NoExplorer = 1 pero para los Bando Object no he encontrado nada análogo

Trabajando con Dlls firmadas (Sign Dlls)

Estoy desarrollando un add-on para el internet explorer y para hacerlo se requiere que todas las dlls que levante el IE estén firmadas.
Yo no soy un experto en este tema pero tuve algunas complicaciones importantes y quería compartir las soluciones que encontré por si a alguien le ayuda.

Particularmente el problema más grande que tuve fue que tenía una dll firmada que se llamaba watin.core.dll (de la herramienta watin), esta dll utilizaba la dll Interop.SHDocVw.
Lo que hice fue incluir ambas dlls en mi proyecto de visual studio que tiene el add-on del IE y lo primero que me patió fue que las dlls no estaban firmadas, por lo que procedí a firmarlas.
Para firmar una dll se deben realizar los siguientes pasos (al menos esta fue la forma que yo encontré):
.- Abrir la linea de comandos del Visual Studio

.- Crear una clave
sn -k myTest.snk //este es el archivo donde se guarda la clave que se genera

.- Luego tenemos que desensamblar (Dis-assembly) la dll que queremos firmar:
ildasm myTest.dll /out:myTest.il

.- Por último hay que ensamblar (Re-Assemble) usando la clave creada
ilasm myTest.il /res:myTest.res /dll /key:myTest.snk /out:myTestSN.dll

Para verificar que quedó bien firmada se puede usar el comando siguiente:
sn -vf myTestSN.dll

Hice este proceso para ambas dlls.

Luego pude ejecutar el add-on y empecé a debaguear. En la primera invocación que hago a una función de la dll watin.core.dll me salta el siguiente error:
"Could not load file or assembly 'Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. A strongly-named assembly is required. (Exception from HRESULT: 0x80131044)"

Ahí es cuando empezaron mis problemas. No entendía porque me daba este error si recién había firmado la dll.

Luego de googlear y googlear no encontré nada específico, pero si algunas pistas que me permitieron llegar a la solución.
El tema es el siguiente, si ven la excepción en una parte dice: "PublicKeyToken=null" Eso es porque el loader estaba intentando levantar una Interop.SHDocVw que no estaba firmada.

Esto se producía porque la referencia en la dll del watin era a una dll Interop.SHDocVw sin firmar.
Esto se puede ver porque si se abre el archivo desensamblado del watin (el que se genero con el comando islam y tiene extensión .il) se puede encontrar lo siguiente:
.assembly extern Microsoft.mshtml
{
.publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....:
.ver 7:0:3300:0
}
.assembly extern Interop.SHDocVw
{
.ver 1:1:0:0
}

Como ven la primera referencia es a una dll firmada (Microsoft.mshtml) ya que tiene publickeytoken mientras que la segunda que es la que daba error no.

Entonces lo que hice fue averiguar la publckey de la dll del interop (sn -T Interop.SHDocVw) y rescribi el .il así:
.assembly extern Interop.SHDocVw
{
.publickeytoken = (C5 23 A1 8A 39 3F E6 5D ) // .?_....:
.ver 1:1:0:0
}

Luego volvía ensamblar la dll del Interop con la herramienta ilasm, probé nuevamente y camino!!!

lunes, 23 de junio de 2008

Coming soon

Los problemas mas comunes que nuestro equipo ha tenido que enfrentar y googleando no encontramos solución .....


El equipo de Abstracta
http:\\www.abstracta.com.uy