如何使用Interop将十进制数从c#传递到vb6

如何使用Interop将十进制数从c#传递到vb6,c#,vb6,interop,decimal,C#,Vb6,Interop,Decimal,我有一个具有以下属性的互操作c#类: decimal ImportoDocumento { get; set; } 如果尝试从vb6访问此属性,将收到一个错误: 编译器错误:函数或接口标记为受限或 函数使用visual basic中不支持的自动化类型 所以我找到了这个局部解决方案: decimal ImportoDocumento { [return: MarshalAs(UnmanagedType.Currency)] get; [param: MarshalAs(UnmanagedTyp

我有一个具有以下属性的互操作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了,但它很好地说明了这一点:

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

通过将属性的类型更改为object,可以将属性声明为变量。我知道.NET Decimal类型实际上与VB6和VBA变量类型兼容,它被烘焙到oleauto.dll中,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代码易于分配字符串时很重要,这并不少见。你也可以考虑CultualField.不变量文化.NoMultFr../P>我试过了。从vb6中,如果我检查obj.importoDocument的值,它就会工作。但是如果我尝试用obj.ImportoDocumento=1.2为它赋值,它会生成一个错误:运行时错误424:object required。这是一个丑陋的VB6问题。它有两个属性设置器(put和putref),但C#只允许一个。尝试设置或让关键字。