如何用互操作将十进制从c#传递到vb6

本文关键字:vb6 何用 互操作 十进制 | 更新日期: 2023-09-27 18:10:22

我有一个带有属性的c#互操作类:

decimal ImportoDocumento {  get; set; }

如果我尝试访问这个属性从vb6收到一个错误:

编译错误:函数或接口被标记为受限或函数使用visualbasic中不支持的自动化类型。

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

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

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

我该怎么办?

如何用互操作将十进制从c#传递到vb6

错误消息是适当的,十进制不是有效的互操作类型。它的标准化很差,像英特尔和AMD这样的大芯片制造商不想碰它。我不记得VB6了,但这篇MSDN文章很好地说明了这一点:

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

通过将其类型更改为object,将属性声明为变体。我知道。net Decimal类型实际上与VB6和VBA变体类型兼容,它被烘烤到CLR和VB6和VBA运行时都使用的oleauto.dll中。解决办法:

[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.