我正在构建一个.NET客户端,并引用了RCW提供的OPC Foundation。
其中一个函数有此参数:
[IN] IntPtr pPercentDeadBand
文档中提到我应该将指针传递给浮点值。
这是我奋斗的地方。我找到了Marshall ..WriteByte,.WriteInt16和.Writeint32。
但是没有什么可以将托管内存中的浮点值写入非托管内存。
答案 0 :(得分:1)
您可以使用Marshal.Copy代替并使用单个元素传入float []。
或者你可以将浮点数填入int并使用Marshal.WriteInt32。这种类似联合的结构可用于在两者之间进行转换
[StructLayout(LayoutKind.Explicit)]
struct SingleInt32Union
{
[FieldOffset(0)]
float s;
[FieldOffset(0)]
int i;
}
答案 1 :(得分:1)
我会采用其中一种方式,从最佳解决方案到最差解决方案:
更改此方法的Interop程序集定义。如果它是指向浮点数的指针,则应声明如下。
ref float pPercentDeadBand
不
[In] IntPtr pPercentDeadBand
使用不安全的代码将指针传递给float:
unsafe
{
float theValueToPass = 345.26f;
IntPtr thePointer = new IntPtr(&theValueToPass);
//pass thePointer to the method;
}
使用Marshal.AllocHGlobal分配4个字节的内存,使用Marshal.Copy从单个元素float数组复制float值,使用从Marshal.AllocHGlobal接收的指针调用该方法,然后使用Marshal释放内存。 FreeHGlobal。
答案 2 :(得分:0)
如果是OPC基金会,它看起来好像有managed code API。根据{{3}},UA SDK 1.00包括对.NET开发环境的支持。