Problemas al leer un ensamblado incrustado (.dll)

Entonces, estoy creando un instalador personalizado para un proyecto mío, y lo que necesitaba era "empaquetar" todo en un solo archivo. (No podía usar ILMerge o .NETZ porque una de las cosas que tenía que incluir era un ensamblado no administrado (¿así se llamaba?). De todos modos, leí muchas cosas principalmente de aquí, y la gente decía para hacer esto:

  • Agregue el .dll como recurso integrado;
  • Agregue un controlador al método AssemblyResolve para que se active cuando mi aplicación no pueda encontrar el ensamblaje.
  • En ese controlador, haga que cargue el .dll desde la memoria usando una función que transfiere el flujo de entrada a una matriz de bytes que puede usar Assembly.Load().

Hice todo eso y agregué una referencia normal al .dll, para que mi código pueda compilarse correctamente. Sin embargo, cuando elimino el archivo. ) aparece y me dice que no pudo cargar mi .dll, aunque le dije explícitamente que lo cargara desde esa matriz de bytes en AssemblyResolve EventHandler.
Lo siento si esto es algo que se ha respondido antes. Sin embargo, mirando las preguntas similares recomendadas, no puedo ver una respuesta a esto.
Lo único que pude ver que podría estar relacionado es que "C# no me permitiría cargar desde bytes, a menos que esté en un contexto de alta seguridad". Si alguien sabe algo, ¿puede confirmar/negar esta declaración y decirme qué es un "contexto de alta seguridad"? Lo admito, soy un novato en cosas complicadas. :)

Gracias de antemano por su tiempo y respuestas!

preguntado el 01 de julio de 12 a las 22:07

1 Respuestas

Assembly es otro nombre para dll administrado: los dll nativos no terminarán en el bit AssemblyResolve afaik. No sé si hay otra opción más que guardar el dll incrustado en el disco al inicio, pero no he encontrado una opción para decirle al sistema operativo (que es responsable de cargar los dll no administrados) cómo encontrar el dll incrustado.

Respondido 01 Jul 12, 22:07

dll "nativo" es igual a dll "administrado", ¿es así? Bueno, el usuario aquí que había dicho lo del contexto de seguridad también dijo que no había problema si el ensamblaje se transmitía al disco y luego se cargaba desde allí usando el Assembly.Load(filename);. Le daré una oportunidad a ese método, ya veremos... - Lumos

"administrado" y "ensamblado" en este caso son .NET-dll. "no administrado" y "nativo" son dll no .NET. El término "nativo" significa que la dll no se puede usar en diferentes plataformas, donde las dll de .NET no son específicas de la plataforma. - C.Evenhuis

@C.Evenhuis La ubicación del dll debe estar en la variable PATH del entorno o en la ubicación desde donde se ejecuta la aplicación. La mejor manera de buscar las ubicaciones donde el sistema operativo intenta buscar el dll es usar ProcMon de sysinternal (technet.microsoft.com/en-us/sysinternals/bb896645.aspx) al monitorear la actividad de lectura/escritura de archivos del proceso de la aplicación. - Amit Mittal

@AmitMittal en otras palabras, un dll nativo tiene que ser un archivo en sí mismo, ¿verdad? - C.Evenhuis

Como la forma más fácil, sí :). Pero como una implementación demasiado compleja, incluso los dll nativos se pueden cargar completamente desde la memoria simulando lo que hace el método LoadLibrary de la API win32 (el caballo de batalla que realmente carga un dll nativo en el espacio de direcciones del proceso). Básicamente, también lee el archivo dll en la memoria y luego hace lo suyo. Algo como esto (aunque esto está completamente en C++, esto también se puede hacer en C#) joachim-bauch.de/tutorials/loading-a-dll-from-memory. - Amit Mittal

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.