【问题标题】:Passing different type of objects to unmanaged function将不同类型的对象传递给非托管函数
【发布时间】:2018-07-20 21:53:52
【问题描述】:

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

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

【问题讨论】:

    标签: c# c interop


    【解决方案1】:

    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);
    

    【讨论】:

    • 是的,那只是路过,不管我用哪种方式路过,我还是要编组它。
    • 将不同类型的对象传递给方法是您的问题吗?
    • 是的,将不同类型的对象传递给非托管函数。我改了标题。
    • 好吧,不幸的是我没有办法自动化它。
    【解决方案2】:

    我通过手动编组解决了这个问题,首先检查 object 的类型,如果 object 是 string,然后我使用 Marshal.StringToHGlobalAnsi,如果是别的东西,那么我会根据我的需要进行不同的编组。

    如果有人有更好的解决方案,请随时写:)

    【讨论】:

      猜你喜欢
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多