2010-05-31 6 views
14

Voy a dar un ejemplo del uso de System.Data.SQLite.DLL que es un ensamblado mixto con código no administrado: Si ejecuto esto:¿Cómo carga dinámicamente ensamblajes sin procesar que contienen código no administrado? (Eludiendo la excepción 'Verificación de política fallida de código no verificable')

var assembly= Assembly.LoadFrom("System.Data.SQLite.DLL") 

No hay excepciones son lanzados, pero si hago esto:

var rawAssembly = File.ReadAllBytes("System.Data.SQLite.DLL"); 
    var assembly = Assembly.Load(rawAssembly); 

El CLR lanza un FileLoadException con "código no comprobable Fallo de la verificación de políticas (excepción de HRESULT: 0x80131402).". Digamos que estoy tratando de cargar este ensamblado en un AppDomain secundario, ¿cómo puedo personalizar la seguridad del Dominio de la Aplicación para permitirme pasar la verificación de la política?

+0

http://stackoverflow.com/a/24037103/1005741 ¡Esto puede ayudar a alguien! – hriziya

Respuesta

13

Somos víctimas de un mensaje de excepción crummy. No se admite cargar ensamblados con Assembly.Load (byte []) que contienen código no administrado. Este es el tema de este feedback item.

ACTUALIZACIÓN: el elemento de comentarios vinculado se ha ido, eliminado como parte de la limpieza en el tiempo de lanzamiento VS2012. La única parte de ella aún podría recuperarse es este fragmento, copiado de otra página Web:

“[...] que sólo permiten imágenes ILOnly a ser cargados [...] ya que todo lo demás no es seguro” -

ACTUALIZACIÓN: enlace corregido con copia de seguridad de archive.org.

+0

¿Podría dar un ejemplo sobre cómo crear un objeto de evidencia apropiado? –

+0

¿Has probado con el AppDomain.Current.Evidence? –

+0

No lo he hecho, pero ¿no es solo una copia de la configuración de seguridad del dominio actual (la que arrojó la excepción en primer lugar)? –

11

El problema es que CLR no realiza los pasos de carga DLL normales, como asignar las secciones separadas de dlls a páginas diferentes, ajustar correcciones, etc. Cuando un ensamblaje se carga desde bytes sin procesar, esos bytes sin procesar se mapean en la memoria como está, y solo se leen los metadatos administrados. Ninguna cantidad de evidencia o configuración de seguridad cambiará este comportamiento.

Cuestiones relacionadas