如何将void *(指向double或int)从C传递给C#

时间:2016-04-14 13:29:07

标签: c# pinvoke marshalling unmanaged managed

我在C中有一般的回调类型:

typedef int(*OverrideFieldValueSetCB_t)(const char *Dialog, const char *FieldName, void *Value);

和回调:

OverrideFieldValueSetCB_t       gOverrideFieldValueSetCB;

和函数我调用C代码将值传递给C#:

int DllGuiSetFieldValue(const char *Dialog, const char *FieldName, void *pValue)
{   
    return gOverrideFieldValueSetCB(Dialog, FieldName, pValue);
}

在C#代码中,我设置了这种代理:

private static int OverrideFieldValueSetCb(string dialogName, string fieldName, IntPtr value)
{
    ///...
}

在上面我想根据fieldName将值编组/转换为int或double。

问题:

  1. IntPtr是否正确?
  2. 如果IntPtr正确,如何将其转换/编组为double或int?

2 个答案:

答案 0 :(得分:2)

"指向double或int"只是在寻找麻烦。

但是,如果您确定自己想要的方式,请查看Marshal类 - Marshal.ReadInt32 int和{{{} 1}} Marshal.PtrToStructure<double>。确保你不要弄乱这两个:)

当然,如果您可以使用double代码,则无需使用unsafe。就像在C中一样进行演员表。

示例:

Marshal

答案 1 :(得分:0)

如果dialogName和fieldName表示它是double,我会这样做:

    private int ChangeFieldValue(string fieldName, IntPtr newValue)
    {
        double[] destination = new double[1];
        Marshal.Copy(newValue, destination, 0, 1);

对此有何想法?似乎工作。