variable - Cómo pasar un decimal de c#a vb6 con Interop
quitar decimales c# (1)
Tengo una clase interoperativa c # con una propiedad:
decimal ImportoDocumento { get; set; }
si intento acceder a esta propiedad desde vb6 a recibir un error:
Error del compilador: función o interfaz marcada como restringida o la función utiliza un tipo de automatización no compatible con Visual Basic.
Entonces encontré esta solución parcial:
decimal ImportoDocumento { [return: MarshalAs(UnmanagedType.Currency)] get; [param: MarshalAs(UnmanagedType.Currency)] set; }
pero la moneda admite números con un máximo de 4 decimales. Tengo números con 6 decimales también.
¿Como lo puedo hacer?
El mensaje de error es apropiado, decimal no es un tipo de interoperabilidad válido. Suficiente estandarización, los grandes panaderos como Intel y AMD no quieren tocarlo con una varilla de diez pies. No recuerdo más VB6 pero este artículo de MSDN trae bien el punto a casa:
En este momento, el tipo de datos Decimal solo se puede usar dentro de una Variante, es decir, no se puede declarar que una variable sea de tipo Decimal. Sin embargo, puede crear una Variante cuyo subtipo sea Decimal utilizando la función CDec.
Usted declara una propiedad como una variante al cambiar su tipo a objeto . Sé que el tipo de .NET Decimal es de hecho compatible con el tipo de variante VB6 y VBA, se hornea en oleauto.dll que es utilizado tanto por el CLR como por el VB6 y el tiempo de ejecución de VBA. Fijar:
[ComVisible(true)]
public interface IExample {
object ImportoDocumento { get; set; }
}
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Example : IExample {
private decimal documento;
public object ImportoDocumento {
get { return documento; }
set { documento = Convert.ToDecimal(value, null); }
}
}
Tenga en cuenta que puede jugar con el argumento IFormatProvider de Convert.ToDecimal (). Importa cuando el código VB6 es apto para asignar una cadena, no es raro. También puede considerar CultureInfo.InvariantCulture.NumberFormat.