¿Cómo puede ocurrir firmar fuertemente una DLL externa, conservando sus metadatos de ensamblado?

StackOverflow https://stackoverflow.com/questions/3497455

  •  29-09-2019
  •  | 
  •  

Pregunta

Tengo algunas bibliotecas que utilizo en mi proyecto que están sin firmar. Debido a que mi solicitud está fuertemente firmado, las bibliotecas tienen que ser así.

Me firmar estas bibliotecas usando:

"%PROGRAMFILES%\Microsoft SDKs\Windows\v7.1\Bin\ildasm.exe" /nobar /all /out=library.il library.dll
"%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ilasm.exe" /dll /key=MyKey.snk library.il

El problema es que los metadatos, tales como números de versión, se pierden en la DLL ahora firmado. Esto es un problema porque ahora algunas dependencias entre las bibliotecas están rotos. ¿Cómo conservo los números de versión sin recurrir a la realidad de compilar el código fuente de las bibliotecas?

Actualizar

En realidad es un archivo DLL en particular que muestra este problema y he descubierto que se construye utilizando ILMerge. Tal vez esto está causando el problema. Para que quede claro:. La DLL que se produce por ILMerge tiene los metadatos adecuado, sólo después de que el montaje y desmontaje, los metadatos desaparece

ACTUALIZACIÓN 2

Me abrió la DLL en el reflector y parece que, al menos, el número de versión es todavía allí. Estaba revisando el uso de las propiedades del archivo de diálogo / ficha Detalles en el Explorador de Windows todo el tiempo. Así que me imagino que es el manifiesto que no se encuentra en su lugar.

¿Fue útil?

Solución

Me pregunto por qué sucede esto. Tengo muy buena experiencia en la compilación de ida y vuelta utilizando ilasm y ildasm en asambleas sin firmar y firmados mismo. Se puede comprobar la salida de metadatos por ILASM todavía contiene la información de versión (parte inferior del marco de montaje):

.assembly ConsoleApplication1
{
  //...
  .hash algorithm 0x00008004
  .ver 1:0:0:0
} 

Sólo comprueba de nuevo, "funciona en mi máquina" (usando exactamente la misma línea de comandos cambia como lo hizo).

Lo que realmente se pierde es la que FileVersion atributo (el que se ve en Windows Explorer cuando se cierne sobre el conjunto. La AssemblyVersion atributo es todavía está presente y correcta . Podría ser que estés confundiendo los dos? Sólo el AssemblyVersion es importante para la información de enlace. Ver este SO publicar para obtener más información.

La esperanza me podría ayudar, de lo contrario se necesitaría para proporcionar más contexto.

Otros consejos

Si tiene el código fuente, a continuación, sólo volver a compilar las bibliotecas con nombres seguros -. Desmontaje y el montaje general funciona bastante bien, pero aún así es un corte

Para mantener las dependencias entre las bibliotecas de trabajo, es necesario actualizar las referencias en el código .il utilizar la clave pública de la asamblea que hacen referencia, de lo contrario van a tratar de hacer referencia a una versión sin firmar de la asamblea, y así no para cargarlo en tiempo de ejecución.

Se puede hacer esto a mano, pero se vuelve muy tedioso después de 2 o 3 montajes. Una solución rápida para esto es firmante , que se ocupa de muchas de las dificultades que implica para usted, y hace un gran trabajo -. por lo general es bastante rápido y limpio

(Tenga en cuenta que en la actualidad se ha construido contra una versión antigua .NET. Si utiliza C # 4 / .NET 4 asambleas tendrá que descargar el código fuente, cambiarlo para apuntar .NET 4 y reconstruirlo para obtener una signer.exe que controlará correctamente .NET 4 conjuntos).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top