如何使用Interop将c#中的小数传递给vb6

时间:2015-08-28 08:20:12

标签: c# vb6 interop decimal

我有一个带有属性的interop c#类:

decimal ImportoDocumento {  get; set; }

如果我尝试从vb6访问此属性,则会收到错误:

  

编译器错误:标记为受限制的功能或界面或   function使用visual basic中不支持的自动化类型。

所以我找到了这个部分解决方案:

decimal ImportoDocumento { [return: MarshalAs(UnmanagedType.Currency)] get; [param: MarshalAs(UnmanagedType.Currency)] set; }

但货币支持最多4位小数的数字。我的数字也是6位小数。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

错误消息是合适的, decimal 不是有效的互操作类型。它的标准化程度非常差,像英特尔和AMD这样的大芯片面包师不想用10英尺的杆子触摸它。我不记得VB6了,但是this MSDN article让点回家了:

  

此时Decimal数据类型只能在Variant中使用,也就是说,您不能将变量声明为Decimal类型。但是,您可以使用CDec函数创建一个其子类型为Decimal的Variant。

通过将属性更改为 object ,可以将属性声明为变体。我知道.NET Decimal类型实际上与VB6和VBA变体类型兼容,它被烘焙到oleauto.dll中,CLR和VB6以及VBA运行时都使用它。修正:

[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); }
    }
}

请注意,您可以使用Convert.ToDecimal()的IFormatProvider参数。 VB6代码易于分配字符串时很重要,并非罕见。您可能还会考虑CultureInfo.InvariantCulture.NumberFormat。