Tengo la siguiente cabecera de la función en un DLL nativa:Mariscal de un unsigned char * Función de regresar de una DLL, en C#
unsigned char* Version_String()
Estoy tratando de llamarlo desde un proyecto de C#, he intentado la siguiente llamada (según lo encontrado en otras preguntas similares aquí):
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
public extern static UIntPtr Version_String();
Y me siguen dando la siguiente excepción:
Intento de leer o escribir prot memoria ect. Esto a menudo es una indicación de que otra memoria está corrupta.
El siguiente intento fue el siguiente y me da la misma excepción:
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
[return : MarshalAs(UnmanagedType.LPStr)]
public extern static string Version_String();
Me parece que no puede conseguir alrededor de este problema. ¡Cualquier ayuda sería muy apreciada!
Editar: miradas
no puedo dar el código DLL aquí, ya que cae bajo un acuerdo de confidencialidad, pero la función que estoy llamando como este:
unsigned char versionString[50];
__declspec(dllexport) unsigned char* Version_String()
{
if(check_hardware_stuff())
{
strcpy((char *) versionString, "version_string_bla_bla");
versionString[5] = stuff;
}
else if (other_check())
{
//will return empty string, that should be filled with '\0'
}
else
{
strcpy((char *) versionString, "ERROR");
}
return versionString;
}
estoy No me gusta especialmente la implementación de DLL, pero necesito usarla "tal como está". Obtengo la excepción cuando trato de llamar al VersionString()
, independientemente de lo que haga con el valor devuelto.
Tal vez esté usando una convención de llamadas incorrecta (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx)? – svick
¿Su dll se compiló con la opción de juego de caracteres MultiByte? –
Utilice el depurador para averiguar dónde se bloquea el código nativo. Project + Properties, Debug, marque "Habilitar la depuración del código no administrado". Establezca un punto de interrupción en la función en el archivo de código fuente C. –