c# - Windows Vista: no se puede cargar DLL ''x.dll'': acceso no válido a la ubicación de la memoria.(DllNotFoundException)
.net windows-vista (6)
Estuve probando en una caja de cliente esta tarde que tiene Windows Vista (tenía su casa, pero estoy probando en una edición comercial con los mismos resultados).
Hacemos uso de un .DLL que obtiene la identificación de hardware de la computadora. Su uso es muy simple y el programa de muestra que he creado funciona. El Dll es esto de AzSdk . De hecho, esto funciona perfectamente en Windows XP. Sin embargo, por alguna extraña razón, dentro de nuestro proyecto (mucho más grande), obtenemos esta excepción:
Exception Type: System.DllNotFoundException
Exception Message: Unable to load DLL ''HardwareID.dll'': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID
No sé qué puede estar causando el problema, ya que tengo control total sobre la carpeta. El proyecto es la aplicación de .NET Windows Forms y todo funciona bien, excepto la llamada a la biblioteca externa.
Lo estoy declarando así: (nota: no es una biblioteca COM y no necesita registrarse).
[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
bool NIC, bool CPU, bool BIOS, string sRegistrationCode);
Y luego el código de llamada es bastante simple:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = GetHardwareID(cb_HDD.Checked,
cb_NIC.Checked,
cb_CPU.Checked,
cb_BIOS.Checked,
"*Registration Code*");
}
Cuando creas una aplicación de muestra, funciona, pero dentro de mi proyecto no. En XP funciona bien. ¿Alguna idea sobre qué debería hacer en Vista para que esto funcione? Como ya he dicho, la carpeta y sus subcarpetas tienen Control total para "Todos".
ACTUALIZACIÓN: no tengo Vista SP 1 instalado.
ACTUALIZACIÓN 2: He instalado Vista SP1 y ahora, con UAC deshabilitado, ¡ni siquiera funciona la muestra simple! :( Maldita Vista.
Además de permitir el control total de "Todos", ¿la ubicación también permite que se escriban procesos con un nivel de integridad medio?
¿Cómo lo verifico? Soy nuevo en Vista, no me gusta demasiado, es muy lento dentro de una VM para el trabajo diario y para el uso de VStudio dentro de una Máquina Virtual, no trae nada nuevo.
Desde un símbolo del sistema puede ejecutar:
icacls C:/Folder
Si ve una línea como "Etiqueta obligatoria / Nivel alto obligatorio", la carpeta solo será accesible para un proceso de alta integridad. Si no existe dicha línea, los procesos de integridad del medio pueden acceder a ella siempre que no haya otras ACL que nieguen el acceso (en función del usuario, por ejemplo).
EDITAR: Olvidé mencionar que puede usar el modificador / setintegritylevel para cambiar realmente el nivel de integridad requerido para acceder al objeto.
Imposible cargar DLL ''HardwareID.dll'': acceso no válido a la ubicación de la memoria. (Excepción de HRESULT: 0x800703E6)
El nombre de DllNotFoundException te confunde: este no es un problema para encontrar o cargar el archivo DLL. El problema es que cuando se carga el archivo DLL, se produce un acceso ilegal a la memoria que hace que el proceso de carga falle.
Al igual que otro póster aquí, creo que esto es un problema DEP, y que sus cambios de UAC, etc., finalmente le han permitido desactivar DEP para esta aplicación.
¿Has hecho una solicitud de soporte al proveedor? Tal vez hay algo en el hardware de MacBook Pro que impide que el producto funcione.
¿La máquina tiene el código desplegado en una máquina de 64 bits? También podría encontrarse con un problema DEP .
Editar
Este es un MacBook Pro de primera generación con un procesador Core Duo 2 Intel de 1ra generación. Lejos de 64 bits.
Mencioné 64 bit, porque en niveles bajos las estructuras de 32 bit a 64 bit no se manejan adecuadamente. Como las máquinas no son de 64 bits, lo más probable es que deshabilitar DEP sería un buen paso lógico. Vista se volvió más seguro que XP SP2.
Bueno, acabo de convertir DEP a nivel mundial en vano. Mismo error.
Bueno, también leí que la gente estaba recibiendo este error después de actualizar una máquina a Vista SP1. ¿Estas instalaciones de Vista tienen SP1 en ellas?
Resulta ser algo completamente diferente. Solo por el bien de las pruebas, he desactivado de UAC (nota: no recibí ningún aviso).
Genial, en realidad iba a sugerir eso, pero pensé que probablemente ya lo habías intentado.
Dado que la excepción es una DllNotFoundException, es posible que desee comprobar el HardwareID.dll con Dependency Walker ANTES de instalar cualquier herramienta de desarrollo en la instalación de Vista para ver si de hecho falta una dependencia.
@ Martín
La razón por la que no recibió el aviso de UAC es porque UAC solo puede cambiar la forma en que se inicia un proceso; una vez que el proceso se está ejecutando, debe permanecer en el mismo nivel de elevación. El aviso de UAC sucederá si:
- Vista cree que es un instalador ( muchas reglas aquí , la más simple es si se llama "setup.exe"),
- Si está marcado como "Ejecutar como administrador" (puede editarlo cambiando las propiedades del acceso directo o el archivo ejecutable), o
- Si el exe contiene un manifiesto que solicita privilegios de administrador.
Las primeras dos opciones son soluciones para aplicaciones ''heredadas'' que existían antes del UAC, la forma correcta de hacerlo para nuevas aplicaciones es incorporar un recurso de manifiesto que solicite los privilegios que necesita.
Algunos programas, como Process Explorer, parecen elevar un proceso en ejecución (cuando eliges "Mostrar detalles para todos los procesos" en el menú de archivos en este caso) pero lo que realmente hacen es iniciar una nueva instancia, y es esa nueva instancia la que obtiene elevado, no el que se estaba ejecutando originalmente. Esta es la forma recomendada de hacerlo si solo algunas partes de su aplicación necesitan elevación (por ejemplo, un diálogo especial de ''opciones de administrador'').