Saltar al contenido

Problemas con C #C ++ DLLImport “Se intentó leer o escribir en la memoria protegida”.

Solución:

Intenta cambiar [In] para [In, Out]. Tampoco estoy seguro de usar tanto el ref y [In, Out] palabras clave juntas en un solo argumento. (Editar: Hans Passant tiene una buena explicación de las diferencias entre los dos en su comentario a continuación).

Consulte este artículo de MSDN para obtener más información, especialmente el pasaje, “De forma predeterminada, los tipos de referencia (clases, matrices, cadenas e interfaces) pasados ​​por valor se calculan como parámetros In por motivos de rendimiento. No verá cambios en estos tipos a menos que aplique InAttribute y OutAttribute (o simplemente OutAttribute) al parámetro del método “.

Comencé a recibir esta excepción durante la interoperabilidad nativa periódicamente después de actualizar a Windows 7. El código siempre había funcionado en XP y tiene menos problemas en Win 7 si ejecuté mi aplicación en modo de compatibilidad con XP.

Después de investigar un poco y experimentar, descubrí que la razón por la que recibía esta excepción tenía que ver con llamar a una función nativa que devolvía una cadena (WCHAR *).

No creo que actualmente haya una solución para esto, ya que incluso la actualización a .Net 3.5 no solucionó el problema … Sin embargo, encontré la siguiente solución.

Ejemplo de lo que funciona en XP pero no en Win 7:

[DllImport("NativeBin.dll")]
public static extern String GetWCharStr();

Ejemplo de lo que me funciona en Win 7 y XP:

[DllImport("NativeBin.dll")]
private static extern IntPtr GetWCharStr();
public static String GetString()
{
    return Marshal.PtrToStringUni(GetWCharStr());
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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