C# 十进制转 VB6 货币

标签 c# vb6 interop decimal currency

我有一个 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/

相关文章:

string - 从VB6中的字符串中删除字符

html - 使用visual basic登录和退出网站

c# - 如何在 C# 和 C++ 之间进行互操作

c# - 原生到托管编码(marshal)处理具有随机值

c# - 如何避免序列化 float 组属性

c# - Visual Studio 文件选择器

c# - ASP.NET 网络 API : any downsides to asynchronous operations?

c# - 如何在 .NET 中使用 CNG(或支持 AES-NI 的指令集)?

internet-explorer - 如何在 VB6 中使 Internet Explorer 不可见地打开?

c# - 互操作保护内存验证