如何用互操作将十进制从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位小数的数字。我也有六位小数。
我该怎么办?
错误消息是适当的,十进制不是有效的互操作类型。它的标准化很差,像英特尔和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.