Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#十进制到VB6货币_C#_Vb6_Interop_Decimal_Currency - Fatal编程技术网

C#十进制到VB6货币

C#十进制到VB6货币,c#,vb6,interop,decimal,currency,C#,Vb6,Interop,Decimal,Currency,我有一个C#DLL和一个Visual Basic 6 DLL 在C#中有一个数据类型为Decimal的字段x。 在VB6中,有一个数据类型为“货币”的字段y 把x传给y再传回来的最好方法是什么 目前,我将字段转换为双倍,但我不确定是否存在舍入影响 更新1: 根据有用的建议,我的代码现在看起来是这样的: public void FromVbToNet(long vb6curr) { decimal value = vb6curr / 10000; } 问题

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

在C#中有一个数据类型为Decimal的字段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中的非托管代码调用它们,目前为止一切似乎都正常。

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

在VB6端,您以
货币
的形式传递数据。在C侧,您将其作为
long
传递。然后在C端,按
10000
进行缩放,在
decimal
值和
long
值之间进行转换

例如,当您将VB6
货币
值保存在C#long中时,您可以将其转换为
十进制
,如下所示:

long vb6curr = ...;
decimal value = vb6curr / 10000;
在另一个方向,它将是:

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

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

我必须在非托管VB6代码中将.Net中的Decimal类型封送到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
}
有关详细信息,请参阅:

很抱歉,我在这里真的不知所措。我尝试了一个长变量(int64),但VB6不支持它。我看到的唯一解决方案是将十进制四舍五入为双精度,因为双精度是VB6唯一知道的64位类型。我说的对吗?在VB6端,使用
Currency
。在C端使用
long
。在
decimal
long
之间转换时,以C#code的形式按
10000
缩放值。