【问题标题】:How pass an decimal from c# to vb6 with Interop如何使用 Interop 将小数从 c# 传递到 vb6
【发布时间】:2015-11-22 20:15:59
【问题描述】:

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

decimal ImportoDocumento {  get; set; }

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

编译器错误:函数或接口标记为受限或 函数使用了 Visual Basic 不支持的自动化类型。

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

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

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

我该怎么办?

【问题讨论】:

    标签: c# vb6 interop decimal


    【解决方案1】:

    错误消息是适当的,十进制不是有效的互操作类型。它的标准化非常差,英特尔和 AMD 等大芯片面包师不想用十英尺长的杆子碰它。我不记得 VB6 了,但 this MSDN article 很好地说明了这一点:

    此时 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。

    【讨论】:

    • 我试过了。如果我从 vb6 检查 obj.ImportoDocumento 的值,它可以工作。但是,如果我尝试使用 obj.ImportoDocumento = 1.2 为其赋值,则会产生错误:运行时错误 424:需要对象。
    • 呃,这是一个难看的 VB6 问题。它有两个用于属性的设置器(put 和 putref),但 C# 只允许一个。试试 Set 或 Let 关键字。
    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 2012-07-13
    • 2011-05-27
    • 1970-01-01
    • 2011-09-02
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多