C# 十进制到 VB6 货币

本文关键字:货币 VB6 十进制 | 更新日期: 2023-09-27 18:34:24

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

在 C# 中,有一个数据类型为十进制的字段 x。在 VB6 中,有一个数据类型为货币的字段 y。

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

目前我将字段转换为双精度,但我不确定是否有舍入含义。

更新 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
}

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

C# 十进制到 VB6 货币

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

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

例如,当您在 C# 长整型中保存 VB6 Currency值时,您可以转换为如下所示decimal

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

在另一个方向上,它将是:

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

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

我不得不将 .Net 中的十进制类型封送到非托管 VB6 代码中的货币类型,反之亦然。

[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