2009-08-05 12 views
8

¿Cómo se resuelven los ensamblados en .NET. Quiero decir, cómo se resuelve un ensamblaje con un nombre completamente calificado. Estoy confundido acerca de los tokens de clave pública/privada y fuerte denominación. Gracias¿Cómo se resuelve un ensamblaje en .NET?

EDIT: También he leído sobre la firma retrasada y cosas por el estilo. ¿La gente realmente lo usa? (¿Alguien ha utilizado realmente la firma de retraso) Quién genera la clave para firmar un ensamblaje. Lo siento si estoy haciendo demasiadas preguntas. Pero, estoy confundido acerca de todo esto.

Respuesta

14

El nombre fuerte se utiliza junto con un "token de clave pública" para producir un ensamblaje nombre de visualización completo (mscorlib, version=2.0.0.0, Culture=neutral, PublicKeyToken=b4778,.....). Esto nos permite tener varias versiones del mismo ensamblaje una al lado de la otra en el mismo directorio de la aplicación.

Un token de clave pública (y por lo tanto, la técnica de nomenclatura de cadenas) también permite que el cargador .NET detecte si alguien ha manipulado los contenidos de su conjunto desde que lo distribuyó. Esto es cierto porque cuando firma un ensamblado con su "token privado", el compilador generará un valor hash que se incrusta en los metadatos del ensamblado que describe la parte pública de su "token privado". El cargador puede usar este valor para determinar si su ensamblaje fue o no modificado.

En cuanto a la resolución de las asambleas, hay algunas cosas básicas a tener en cuenta:

  • Sondeo El cargador intenta localizar montajes utilizando un directorio básico "de sondeo" técnica. Esto significa que intentará localizar "MyAssembly.dll" (por ejemplo) en el directorio de inicio de la aplicación, si no está allí, luego en subdirectorios debajo de eso. Si el sondeo falla al ubicar "MyAssembly.dll", se activa el evento AppDomainAssemblyResolve.

  • configuración de la máquina/usuario/Sistema de El machine.config, user.config y system.config se almacenan los archivos de configuración de forma local en el sistema que se puede utilizar para cambiar el comportamiento de la resolución de montaje en una, "usuario" "máquina" o ajuste "amplio" del sistema.

  • Política Editorial se puede utilizar el "<assemblyIdentity>" señal XML en el archivo de configuración de la aplicación (por ejemplo, "MyApp.exe.config") para señalar a Resolver con una cierta versión de un conjunto o para cargar un ensamblado de una ubicación diferente.

  • resolución personalizada manija del "AssemblyResolve" evento de la AppDomain. Este evento se genera cada vez que un conjunto no podía resolverse a través de métodos "tradicionales"

Con mucho, el mecanismo menos complicado es para controlar el evento "AssemblyResolve".

En resumen, el resolver busca en el directorio actual o en el caché de conjunto global, procesa la política y finalmente permite la resolución personalizada.

+0

"permite que el cargador .NET detecte si alguien ha alterado el contenido de su ensamblaje ..." no lo consiguió del todo. –

+2

Claro. Básicamente, cuando compila su ensamblado con un fuerte valor hash de nombre (también puede usar la utilidad de línea de comandos sn.exe), el valor hash se escribe en los metadatos del ensamblaje que describe su versión, cultura, nombre y valor de token. Cuando el cargador carga su ensamblaje, comprueba si su ensamblaje tiene un token de clave pública y, de ser así, ejecuta el mismo algoritmo hash sobre su ensamblaje, lo compara con los metadatos del ensamblaje y se niega a cargar el ensamblaje si difieren. Así es como la carga detecta "manipulación". Es muy limitado como puede ver, pero es suficiente por ahora. –

+0

En la superficie, parece una forma de proteger nuestro código .NET. Pero, por desgracia, la emoción desaparece rápidamente y pronto se dará cuenta de que la ofuscación es la mejor alternativa. –

1

La resolución de ensamblajes puede implicar una serie de pasos, dependiendo de dónde esté tratando de cargar el ensamblaje (GAC, carpeta base de aplicación, subcarpetas u otra carpeta fuera de la carpeta de la aplicación base).

Este es un buen artículo acerca de cómo se puede especificar dónde .Net busca sus ensamblajes. MSDN Article

Si desea que el tiempo de ejecución para resolver una asamblea que no se almacena en la carpeta de base de aplicación o el GAC entonces usted tendrá que registrarse para el evento dominio de aplicación que se eleva cuando no puede encontrar el montaje. Luego, reaccionaría ante ese evento comprobando si el archivo existe en su otra ubicación y luego lo devolverá usando Assembly.LoadFrom (thePath).

sólo para añadir a esta respuesta es aún más este enlace grietas que debe resumir toda la nomenclatura fuerte con teclas muy bien para usted: Strong Naming - keys etc..

Para cualquier duda de esto, sólo hay que preguntar!

+0

¿Quién genera la clave para firmar un ensamblaje? –

2

El siguiente artículo en MSDN pueden serle de ayuda: Resolución

http://msdn.microsoft.com/en-us/library/yx7xezcf(VS.71).aspx

Asamblea en .NET puede ser bastante compleja, como conjuntos pueden estar ubicados en una variedad de lugares, entre ellos el GAC ubicadas conjuntamente en la ejecutar ensamblado, copiar sombra, etc. El proceso general se denomina proceso Fusion y garantiza que se cumplan las medidas de seguridad adecuadas al cargar ensamblajes.

Cuestiones relacionadas