¿Hay alguna forma de convertir mediante progtwigción cadenas de formato VB6 a cadenas de formato .NET?

  1. ¿Alguien sabe de una buena referencia para cadenas de formato VB6?
  2. ¿Alguien sabe de un convertidor de cadenas de formato VB6 a cadenas .NET?

Estoy trabajando en portar una gran base de código VB6 a .NET. Es una pieza de software centrada en la base de datos, y la base de datos en sí misma contiene cadenas de formato VB6 que luego se cargan y se usan para mostrar otros datos en la base de datos.

Mi pregunta, al igual que este artículo , es cómo portar esto. Sin embargo, la respuesta elegida para esa pregunta no es adecuada para mis necesidades. Me incomoda confiar en las bibliotecas diseñadas específicamente para compatibilidad con versiones anteriores con un idioma que he sido contratado específicamente para exportar.

La rutina de formateo que usa VB6 está integrada en el sistema operativo. Oleaut32.dll, la función VarFormat (). Ha existido durante 15 años y seguirá existiendo, teniendo en cuenta la cantidad de código que se basa en él. Intentar traducir las cadenas de formato a una cadena de formato compuesta .NET es una tarea desesperada. Solo usa la función del sistema operativo.

Aquí hay un progtwig de ejemplo que hace esto, usando los ejemplos del hilo enlazado:

using System; using System.Runtime.InteropServices; class Program { static void Main(string[] args) { Console.WriteLine(Vb6Format("hi there", ">")); Console.WriteLine(Vb6Format("hI tHeRe", "<")); Console.WriteLine(Vb6Format("hi there", ">!@@@... not @@@@@")); Console.ReadLine(); } public static string Vb6Format(object expr, string format) { string result; int hr = VarFormat(ref expr, format, 0, 0, 0, out result); if (hr != 0) throw new COMException("Format error", hr); return result; } [DllImport("oleaut32.dll", CharSet = CharSet.Unicode)] private static extern int VarFormat(ref object expr, string format, int firstDay, int firstWeek, int flags, [MarshalAs(UnmanagedType.BStr)] out string result); } 

Su mejor opción podría ser escribir la biblioteca de conversión usted mismo, pero probablemente esa no era la respuesta que esperaba obtener.

Aquí hay algunos códigos F # que traducen la mayoría de las cadenas de formato numérico y de fecha de estilo VB6 predefinidas y personalizadas a algo adecuado para String.Format . Se llama fácilmente desde C # o VB, por supuesto.

 open System module VB6Format = /// Converts a VB6-style format string to something suitable for String.Format() let Convert(vb6Format) = if String.IsNullOrWhiteSpace(vb6Format) then "{0}" else match if vb6Format.Length > 1 then vb6Format.ToUpperInvariant() else vb6Format with // PREDEFINED NUMERIC: http://msdn.microsoft.com/en-us/library/y006s0cz(v=vs.71).aspx | "GENERAL NUMBER" | "G" -> "{0:G}" | "g" -> "{0:g}" | "CURRENCY" | "C" | "c" -> "{0:C}" | "FIXED" | "F" -> "{0:F}" | "f" -> "{0:f}" | "STANDARD" | "N" | "n" -> "{0:N}" | "PERCENT" | "P" | "p" -> "{0:P}" | "SCIENTIFIC" -> "{0:E2}" | "E" | "e" -> "{0:E6}" | "D" | "d" -> "{0:D}" | "X" | "x" -> "{0:X}" | "YES/NO" | "ON/OFF" // we can't support these | "TRUE/FALSE" -> "{0}" // PREDEFINED DATE/TIME: http://msdn.microsoft.com/en-us/library/362btx8f(v=VS.71).aspx | "GENERAL DATE" | "G" -> "{0:G}" | "LONG DATE" | "D" -> "{0:D}" | "MEDIUM DATE" | "SHORT DATE" | "d" -> "{0:d}" | "LONG TIME" | "T" -> "{0:T}" | "MEDIUM TIME" | "SHORT TIME" | "t" -> "{0:t}" | "M" | "m" -> "{0:M}" | "R" | "r" -> "{0:R}" | "s" -> "{0:s}" | "u" -> "{0:u}" | "U" -> "{0:U}" | "Y" | "y" -> "{0:Y}" // USER-DEFINED: http://msdn.microsoft.com/en-us/library/4fb56f4y(v=vs.71).aspx // http://msdn.microsoft.com/en-us/library/73ctwf33(v=VS.71).aspx // The user-defined format strings translate more-or-less exactly, so we're just going to use them. | _ -> sprintf "{0:%s}" vb6Format