VS bloquea assemblies cargados desde la web

¡Hola!

Situación explicada rápidament: Si te descargas un assembly directamente desde internet, y añades una referencia a dicho assembly, la referencia te aparecerá como añadida, pero VS no hará caso de ella. Cuando compiles te aparecerá un error parecido a:

Unable to load the metadata for assembly ‘AvalonDock’. This assembly may have been downloaded from the web.  See http://go.microsoft.com/fwlink/?LinkId=179545.  The following error was encountered during load: Could not load file or assembly ‘AvalonDock, Version=1.2.2691.0, Culture=neutral, PublicKeyToken=85a1e0ada7ec13e4’ or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)

En mi caso, efectivamente me descargué la última versión de AvalonDock (desde su página de descargas puedes descargarte un msi que lo instala o simplemente el assembly que contiene la librería y que es lo que yo hice).

Por suerte el propio mensaje de error de VS es más que expícito y si te vas a la página que menciona (http://go.microsoft.com/fwlink/?LinkId=179545) verás la explicación de lo que hay que hacer: Básicamente cerrar VS y con el explorador de archivos abrir las propiedades del archivo y darle a desbloquear:

image

Y listos! Ya puedes usar tu assembly… ten presente que esto da permisos full trust al assembly, así que… andate con cuidado! 😉

¿Y como sabe VS que el archivo ha sido descargado?

Esta pregunta se aplica no sólo a VS sinó a Windows en general. Como sabe Windows que dicho archivo ha sido descargado de la web? Si lo mueves de carpeta, lo renombras o incluso lo copias a otro ordenador windows seguirá sabiendo que el archivo ha sido descargado de la web.

La respuesta es realmente simple: Windows guarda esta información en el propio archivo y lo hace gracias a una capacidad no muy conocida de NTFS llamada alternate data streams (ADS). Dicha capacidad (insisto de NTFS) permite asociar metadatos a un archivo. Cuando descargamos un archivo de la red, windows crea un ADS en dicho archivo y lo marca como descargado de la red. Los ADS se crean junto con el archivo (no se guardan en ningún sitio separado).

Para poder abrir un ADS basta con saber el nombre de este y añadirlo junto con dos puntos (:) al nombre del archivo. P.ej. el ADS que windows asocia a los archivos descargados de internet se llama “Zone.Identifier”. Así, en mi caso si yo hago:

notepad AvalonDock.dll:Zone.Identifier

obtengo lo siguiente:

image

Cuando pulso el botón de “Unblock” desde el explorador de archivos lo que hace es borrar dicho ADS del archivo.

Usando explorer no podeis saber fácilmente si un archivo contiene ADS o no: aunque los ADS modifican el tamaño real del archivo (puesto que se guardan junto a este), el explorador de archivos sólo os muestra el tamaño del flujo principal (o sea el del archivo sin los ADS) y lo mismo hace el comando “dir” de MS-DOS. Si quereis saber los ADS que tienen vuestros archivos, hay por ahí afuera varios visores de ADS (aunque yo no he probado ninguno).

Por cierto, que os he dicho que los ADS, dado que se guardan junto con el archivo, se mantienen cuando se copia, se modifica o se mueve el archivo y esto es cierto siempre que se use NTFS. Si se copia un archivo que contiene ADS a un sistema que no los soporta (p.ej. FAT32 usado en las llaves USB), el ADS se pierde.

Un saludote!! 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *