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

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

decimal ImportoDocumento { get; set; } 

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

编译器错误:标记为受限制的函数或接口,或者函数使用visual basic中不支持的自动化类型。

所以我发现了这个部分解决方案

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

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

我能怎么做?

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

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

通过将属性更改为对象 ,可以将属性声明为变量。 我知道.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。