Programación para implementar sobrecarga
Prueba:
int iSum = RefComm.mySum (,);
El resultado de ejecutar iSum es 5 y la llamada es correcta. Se completa el primer paso del experimento, que muestra que las funciones de biblioteca de vínculos dinámicos definidas por el usuario se pueden llamar en C#.
En el segundo paso, definí una función para manipulación de cadenas (para simplificar, todavía uso el nombre de la función anterior), devolví el resultado como una cadena y la llamé en C#
Prueba:
string strDest =
string strTmp= RefComm.mySum("45", strDest);
StrTmp es "45", pero strDest es nulo. Modifiqué la implementación de la biblioteca de enlaces dinámicos y el resultado devuelto es la cadena b:
LIBEXPORT_API char *mySum(char *a, char *b){sprintf(b, "s", a) return b ;}
Modifique la definición de importación de C# y cambie la cadena B al modo de referencia:
Clase pública RefComm
{
[DllImport ( "LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet = juego de caracteres. convención de llamada = llamada a StdCall)]
cadena externa estática pública mySum(string a, ref string b);
}
Llame a la prueba nuevamente usando C#:
string strDest =
string strTmp= RefComm.mySum("45 ", ref strDest);
Tanto strTmp como strDest son incorrectos y contienen caracteres invisibles. Luego modifique la definición de importación de C# y cambie CharSet de Auto.
Ansi:
Clase pública RefComm
{
[DllImport("LibEncrypt.dll ",
EntryPoint = " mySum ",
CharSet = conjunto de caracteres, convención de llamada = convención de llamada)]
cadena externa estática pública mySum(String a, String b);
}
Llame a la prueba nuevamente usando C#:
string strDest =
string strTmp= RefComm. mySum("45", ref strDest);
El resultado de ejecutar la vista es strTmp "45", pero a la cadena strDest no se le asigna un valor. El segundo paso es implementar la función para devolver una cadena, pero los parámetros en la función existen.
No se puede imprimir en. Modifique nuevamente la definición de importación de C# y modifique la cadena B como referencia (ref):
Clase pública RefComm
{
[DllImport("LibEncrypt.dll ",
EntryPoint=" mySum ",
CharSet = CharSet, CallingConvention = CallingConvention.
StdCall)]
cadena externa estática pública mySum(string a, ref string b);
}
La llamada en tiempo de ejecución falló y la ejecución no puede continuar.
El tercer paso es modificar la implementación de la biblioteca de enlaces dinámicos, cambiar B a un puntero doble y usar C# para llamar a la prueba:
string strDest =
cadena strTmp= RefComm. mySum("45", ref strDest);
Los resultados de ejecutar y ver strTmp y strDest son ambos "45" y la llamada es correcta. El tercer paso es lograr el resultado de salida correcto de los parámetros de salida de la función.
El cuarto paso es modificar la implementación de la biblioteca de enlaces dinámicos para realizar la salida de parámetros enteros y llamar a la prueba en C#:
int c = 0;
int iSum = RefComm. mySum(,, ref c);
El resultado de ejecutar y ver es que iSum y C son ambos 5 y la llamada es correcta.