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!!!