我在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。
问题:
- IntPtr正确吗
- 如果IntPtr是正确的,如何将其强制转换/封送为double或int
"指向double或int"只是在找麻烦。
但是,如果您确定这是您想要的方式,请查看Marshal
类——Marshal.ReadInt32
用于int
,Marshal.PtrToStructure<double>
用于double
。确保你不会把两者搞砸:)
当然,如果可以使用unsafe
代码,则不需要使用Marshal
。就像你在C.里演的一样
示例:
double val = 123.45d;
double second;
double third;
unsafe
{
void* ptr = &val;
second = *(double*)ptr;
third = Marshal.PtrToStructure<double>(new IntPtr(&val));
}
second.Dump();
如果dialogName和fieldName指示它是双I do:
private int ChangeFieldValue(string fieldName, IntPtr newValue)
{
double[] destination = new double[1];
Marshal.Copy(newValue, destination, 0, 1);
对此有什么想法吗?似乎有效。