将浮点值写入非托管内存?

时间:2009-10-08 22:28:06

标签: .net interop

我正在构建一个.NET客户端,并引用了RCW提供的OPC Foundation

其中一个函数有此参数:

[IN] IntPtr pPercentDeadBand

文档中提到我应该将指针传递给浮点值。

这是我奋斗的地方。我找到了Marshall ..WriteByte,.WriteInt16和.Writeint32。

但是没有什么可以将托管内存中的浮点值写入非托管内存。

3 个答案:

答案 0 :(得分:1)

您可以使用Marshal.Copy代替并使用单个元素传入float []。

或者你可以将浮点数填入int并使用Marshal.WriteInt32。这种类似联合的结构可用于在两者之间进行转换

[StructLayout(LayoutKind.Explicit)]
struct SingleInt32Union
{
    [FieldOffset(0)]
    float s;
    [FieldOffset(0)]
    int i;
}

答案 1 :(得分:1)

我会采用其中一种方式,从最佳解决方案到最差解决方案:

  1. 更改此方法的Interop程序集定义。如果它是指向浮点数的指针,则应声明如下。

    ref float pPercentDeadBand
    

    [In] IntPtr pPercentDeadBand
    
  2. 使用不安全的代码将指针传递给float:

    unsafe
    {
        float theValueToPass = 345.26f;
        IntPtr thePointer = new IntPtr(&theValueToPass);
        //pass thePointer to the method;
    }
    
  3. 使用Marshal.AllocHGlobal分配4个字节的内存,使用Marshal.Copy从单个元素float数组复制float值,使用从Marshal.AllocHGlobal接收的指针调用该方法,然后使用Marshal释放内存。 FreeHGlobal。

答案 2 :(得分:0)

如果是OPC基金会,它看起来好像有managed code API。根据{{​​3}},UA SDK 1.00包括对.NET开发环境的支持。