C#十进制到VB6货币

Luk*_*age 6 c# vb6 interop currency decimal

我有一个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;
    }
Run Code Online (Sandbox Code Playgroud)

问题是,当我尝试通过互操作从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
}
Run Code Online (Sandbox Code Playgroud)

我用VB6中的非托管代码用Currency参数调用这些代码,到目前为止一切似乎都有效.

Dav*_*nan 9

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

在VB6端,您将数据传递为Currency.在C#端你传递它long.然后在C#侧,您可以缩放10,000以在您的decimal值和long值之间进行转换.

例如,当您Currency在C#中保存VB6 值时,您将转换为decimal如下所示:

long vb6curr = ...;
decimal value = vb6curr / 10000;
Run Code Online (Sandbox Code Playgroud)

在另一个方向,它将是:

decimal value = ...;
long vb6curr = Convert.ToInt64(value*10000);
Run Code Online (Sandbox Code Playgroud)


Luk*_*age 7

经过一番阅读后,我想出了这个解决方案(参见Update 2).

我不得不将.Net中的Decimal类型编组为非托管VB6代码中的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
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅:http: //msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute%28v=vs.110%29.aspx