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 AppDomain
AssemblyResolve
.
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.
"permite que el cargador .NET detecte si alguien ha alterado el contenido de su ensamblaje ..." no lo consiguió del todo. –
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. –
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. –