首先:如果标题错误,我很抱歉。我不确定如何命名我的问题。
在我的C API中,我有一个功能:
MYAPI_STATUS SetParam(void *hInst, unsigned long param, void *value);
此函数根据param
类型接受不同类型的指针。像这样:
SetParam(hInst, 1, (void*)"somevalue");
int x = 55;
SetParam(hInst, 2, &x);
我只是在C#中编写一个包装器/绑定,我遇到了问题。
[DllImport("myapi", CallingConvention = CallingConvention.Cdecl]
public static extern uint SetParam(IntPtr hInst, uint paramCode, IntPtr paramValue);
从C复制行为的最佳方法是什么?所以函数看起来像:
public static uint SetParam(IntPtr hInst, uint paramCode, ref object paramValue);
或可能:
public static uint SetParam(IntPtr hInst, uint paramCode, object paramValue);
答案 0 :(得分:0)
如果object
是object
,我首先检查string
的类型,然后我使用Marshal.StringToHGlobalAnsi
,如果它是其他的话,我通过手动编组来解决它,然后根据具体内容进行不同的编组我需要。
如果有人有更好的解决方案,请随时写信:)
答案 1 :(得分:0)
C编程中的*
符号表示参数 by reference
,因此此代码不匹配:
public static uint SetParam(IntPtr hInst, uint paramCode, object paramValue);
因为它提供参数 by value
。
此代码与您想要的非常相似:
public static uint SetParam(IntPtr hInst, uint paramCode, ref object paramValue);
但是有点不同。在参数之前使用ref
时,必须在发送到方法之前对其进行初始化,但使用out
时,您没有传递它的限制。所以我认为最好的匹配将是这段代码:
public static uint SetParam(IntPtr hInst, uint paramCode, out object paramValue);