Ho la seguente intestazione funzione in una DLL nativa:maresciallo un unsigned char * Funzione di ritorno da una dll, in C#
unsigned char* Version_String()
Sto cercando di chiamare da un progetto C#, ho provato la seguente chiamata (come si trova su altre domande simili qui):
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
public extern static UIntPtr Version_String();
e continuo a ricevere la seguente eccezione:
ha tentato di leggere o scrivere prot memoria Questo è spesso un'indicazione che un'altra memoria è corrotta.
Il tentativo successivo è stato il seguente e ho la stessa eccezione:
[DllImport("BSL430.dll", CharSet=CharSet.Ansi)]
[return : MarshalAs(UnmanagedType.LPStr)]
public extern static string Version_String();
non riesco per aggirare questo problema. Qualsiasi aiuto sarebbe molto apprezzato!
Edit:
non posso dare il codice DLL qui, in quanto cade sotto un NDA, ma la funzione sto chiamando simile a questa:
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;
}
Sono non mi piace particolarmente l'implementazione della DLL, ma ho bisogno di usarla "così com'è". Ricevo l'eccezione generata ogni volta che provo a chiamare VersionString()
, indipendentemente da ciò che faccio del valore restituito.
Forse stai usando sbagliato [convenzione chiamata] (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention.aspx)? – svick
La tua DLL è stata compilata con l'opzione charset MultiByte? –
Utilizzare il debugger per scoprire dove si arresta il codice nativo. Progetto + Proprietà, Debug, selezionare "Abilita debug del codice non gestito". Impostare un punto di interruzione sulla funzione nel file del codice sorgente C. –