La primera cosa que hay que hacer es usar stdcall
en el lado C#:
[DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall,
CharSet=CharSet.Auto)]
También me gustaría estar seguro de que el lado Delphi es post Delphi 2009 y por lo tanto utiliza caracteres de ancho. Si es así, entonces no hay problema allí. Si está utilizando un Delphi no Unicode, necesitará CharSet.Ansi
.
yo probablemente también devolver un LongBool
en el lado Delphi y Mariscal con
[return: MarshalAs(UnmanagedType.Bool)]
de nuevo en el lado .NET.
Finalmente, la matriz de longitud fija debe organizarse de manera diferente. El enfoque estándar para las matrices de caracteres de longitud fija es usar un StringBuilder
en el lado de .NET que se organiza según lo desee.
Ponerlo en conjunto, y la fijación de su sintaxis de Delphi, da:
Delphi
type
TFixedLengthArray = array [1..200] of char;
function Get_Matrix(var Matrix: TFixedLengthArray): LongBool; stdcall;
C#
[DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall,
CharSet=CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool Get_Matrix(StringBuilder Matrix);
static void Main(string[] args)
{
StringBuilder Matrix = new StringBuilder(200);
Get_Matrix(Matrix);
}
Por último, asegúrese de que usted nulo termina su cadena cuando lo devuelve desde su DLL!
Hola, el problema se detiene. Esto parece ser relativo a la "matriz de caracteres", cuando declaro la importación sin ningún parámetro, el programa aún se está ejecutando, pero cuando declaro el parámetro de caracteres –
¿Qué versión de Delphi? –
Hola, no pensaba en serio. Me había olvidado de la matriz de matrices. Creo que la respuesta actualizada hará el trabajo por usted. –