我有一个 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 调用它时,出现编译错误:
“标记为受限的函数或接口(interface),或者函数使用了 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 参数从我的非托管代码中调用它们,到目前为止一切似乎都正常。
最佳答案
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);
关于C# 十进制转 VB6 货币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27521782/