将不同类型的对象传递给非托管函数

时间:2018-02-10 05:14:32

标签: c# c interop

首先:如果标题错误,我很抱歉。我不确定如何命名我的问题。

在我的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);

2 个答案:

答案 0 :(得分:0)

如果objectobject,我首先检查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);