jueves, 13 de mayo de 2010

VB6 Fixed String en C#

Un nuevo asunto. Resulta que tengo que utilizar una DLL de un SDK de un sistema administrativo. Hay unos VB Types como

Public Type tSerie
aUnidades As Double
aTipoCambio As Double
aSeries As String * kLongSeries
aPedimento As String * kLongDescripcion
aAgencia As String * kLongDescripcion
aFechaPedimento As String * kLongFecha
aNumeroLote As String * kLongDescripcion
aFechaFabricacion As String * kLongFecha
aFechaCaducidad As String * kLongFecha
End Type

Pero en .NET no hay cadenas de longitud fija. Entonces investigando, a lo que llegué es que hay que utilizar MarshalAs, así que en .NET quedaría de esta forma:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 4)]
public struct tSerie
{
public double aUnidades;
public double aTipoCambio;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constantes.kLongSeries)]
public byte[] aSeries;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constantes.kLongDescripcion)]
public byte[] aPedimento;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constantes.kLongDescripcion)]
public byte[] aAgencia;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constantes.kLongFecha)]
public byte[] aFechaPedimento;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constantes.kLongDescripcion)]
public byte[] aNumeroLote;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constantes.kLongFecha)]
public byte[] aFechaFabricacion;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constantes.kLongFecha)]
public byte[] aFechaCaducidad;
}

Así lo implementé y ya no me dio problemas. Ojalá les sea de utilidad.