我有一个带有属性的interop c#类:
decimal ImportoDocumento { get; set; }
如果我尝试从vb6访问此属性,则会收到错误:
编译器错误:标记为受限制的功能或界面或 function使用visual basic中不支持的自动化类型。
所以我找到了这个部分解决方案:
decimal ImportoDocumento { [return: MarshalAs(UnmanagedType.Currency)] get; [param: MarshalAs(UnmanagedType.Currency)] set; }
但货币支持最多4位小数的数字。我的数字也是6位小数。
我该怎么办?
答案 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。