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参数调用这些代码,到目前为止一切似乎都有效.
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)
经过一番阅读后,我想出了这个解决方案(参见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