【问题标题】:C# Decimal to VB6 CurrencyC# 十进制转 VB6 货币
【发布时间】:2023-04-02 10:30:01
【问题描述】:

我有一个 C# DLL 和一个 Visual Basic 6 DLL。

在 C# 中有一个数据类型为 Decimal 的字段 x。 在 VB6 中有一个数据类型为 Currency 的字段 y。

将 x 传递给 y 并返回的最佳方法是什么?

目前我将字段转换为 Double,但我不确定是否存在舍入含义。

更新 1:

根据有用的建议,这就是我的代码现在的样子:

    public void FromVbToNet(long vb6curr)
    {
        decimal value = vb6curr / 10000;
    }

问题是,当我尝试通过互操作从 VB6 调用它时,出现编译错误:

“函数或接口标记为受限,或函数使用 Visual Basic 不支持的自动化类型”

那么我该如何声明 vb6curr 呢? 字符串对象动态

更新 2:

如果有人需要此作为参考,在进一步阅读后我想出了以下解决方案:

[return: MarshalAs(UnmanagedType.Currency)]
public decimal GetDecimalFromNetDll()
{
    decimal value = ... // Read from database
    return value;
}

public void SetDecimalInNetDll([MarshalAs(UnmanagedType.Currency)] decimal value)
{
    // Save to database
}

我在 VB6 中使用 Currency 参数从我的非托管代码中调用这些,到目前为止一切正常。

【问题讨论】:

    标签: c# vb6 interop decimal currency


    【解决方案1】:

    经过一番阅读,我想出了这个解决方案(另请参阅更新 2)。

    我必须将 .Net 中的 Decimal 类型编组为非托管 VB6 代码中的 Currency 类型,反之亦然。

    [return: MarshalAs(UnmanagedType.Currency)]
    public decimal GetDecimalFromNetDll()
    {
        decimal value = ... // Read from database
        return value;
    } 
    
    public void SetDecimalInNetDll([MarshalAs(UnmanagedType.Currency)] decimal value)
    {
        // Save to database
    }
    

    有关详细信息,请参阅: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute%28v=vs.110%29.aspx

    【讨论】:

      【解决方案2】:

      VB6 Currency 数据类型存储为 64 位整数,隐式按 10,000 缩放。有了这些知识,就可以直接在该类型和 .net Decimal 之间进行转换。

      在 VB6 端,您将数据作为Currency 传递。在 C# 方面,您将其传递为 long。然后在 C# 端,按 10,000 缩放以在 decimal 值和 long 值之间进行转换。

      例如,当您将 VB6 Currency 值保存在 C# long 中时,您可以像这样转换为 decimal

      long vb6curr = ...;
      decimal value = vb6curr / 10000;
      

      另一个方向是:

      decimal value = ...;
      long vb6curr = Convert.ToInt64(value*10000);
      

      【讨论】:

      • 对不起,我真的很茫然。我尝试了一个长变量(int64),但 VB6 不支持。我看到的唯一解决方案是将小数四舍五入为双精度数,因为双精度数是 VB6 知道的唯一 64 位类型。我说的对吗?
      • 在 VB6 端,使用Currency。在 C# 端使用long。在 decimallong 之间转换时,在 C# 代码中按 10,000 缩放值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-02
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多