C#十进制到VB6货币
我有一个C#DLL和一个Visual Basic 6 DLL 在C#中有一个数据类型为Decimal的字段x。 在VB6中,有一个数据类型为“货币”的字段y 把x传给y再传回来的最好方法是什么 目前,我将字段转换为双倍,但我不确定是否存在舍入影响 更新1: 根据有用的建议,我的代码现在看起来是这样的: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; } 问题
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
缩放。有了这些知识,就可以直接在该类型和.netDecimal
之间进行转换
在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
缩放值。