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 中的非托管代码调用这些代码,到目前为止一切似乎都正常。
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